diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index b716e6929..000000000
--- a/.editorconfig
+++ /dev/null
@@ -1,20 +0,0 @@
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_size = 2
-tab_width = 2
-max_line_length = 160
-indent_style = space
-insert_final_newline = true
-
-[*.md]
-max_line_length = off
-
-[*.toon]
-indent_size = 1
-tab_width = 1
-
-[Makefile]
-indent_style = tab
diff --git a/.gitignore b/.gitignore
index 305dd8a41..ff074fbc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,95 +1,79 @@
-### android studio ###
-/local.properties
-
-### gradle ###
-.gradle
-build/
-/build-cache/
-/generated/
-generated_tests/
-.generated/
-.xcodemap/
-!gradle/wrapper/gradle-wrapper.jar
+*.hprof
+*.iml
+*.ipr
+*.iws
+*.log
+*.mode1v3
+*.sln
+*.xcodeproj
+*.xcuserstate
+*.xcworkspace
+**/bin/
+**/out/
+*resources/static/
+!**/out/
!**/src/main/**/build/
!**/src/test/**/build/
-.gradle-user-home/
-
-### kotlin ###
-.kotlin
-.kotlin/
+!gradle/wrapper/gradle-wrapper.jar
-### STS ###
+.vscode/
+.idea/
+.agent/
+.cursorignore
+.qoderignore
+.warpindexignore
.apt_generated
.classpath
+.codebuddy/
+.claude/
+.cursor/
.factorypath
+.factory/
+.generated/
+.gradle
+.gradle-user-home/
+.jpb/
+.kiro/
+.kotlin
+.kotlin/
+.logs
+.playwright-mcp/
.project
+.qoder/
.settings
.springBeans
.sts4-cache
-**/bin/
-src/main/**/bin/
-src/test/**/bin/
+.vs
+.windsurf/
-### IntelliJ IDEA ###
-*.iws
-*.iml
-*.ipr
-**/out/
-!**/out/
-src/main/**/out/
-src/test/**/out/
-.jpb/
-*.hprof
-/out/
/amplicode.xml
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
+/build-cache/
/dist/
+/generated/
+/local.properties
+/nbbuild/
/nbdist/
-/.nb-gradle/
-
-### visual studio ###
-.vs
-*.sln
-*resources/static/
-
-### xcode ###
-*.xcworkspace
-*.xcodeproj
-*.xcuserstate
-*.mode1v3
-
-### logs ###
-logs
-.logs
-*.log
/.env
-### publish gpg ###
-/private.gpg
-
-### Customs ###
-TODO.*
-
-### AI Coder ###
/.intellijPlatform/
-node_modules/
-pnpm-lock.yaml
-.claude/
-.cursor/
-.factory/
-.ai/
-__ai/
-__aiissues/
-CLAUDE.md
-AGENTS.md
-
-### claude code ###
/.mcp.json
+/.nb-gradle/
+/nbproject/private/
+/out/
+/private.gpg
-### Windows issues ###
+AGENTS.md
+build/
+CLAUDE.md
+generated_tests/
+logs
+node_modules/
nul
-.playwright-mcp/
-.codebuddy/
-.qoder/
+pnpm-lock.yaml
+src/main/**/bin/
+src/main/**/out/
+src/test/**/bin/
+src/test/**/out/
+TODO.*
+GEMINI.md
+WARP.md
+.editorconfig
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index b9ad7d893..000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# 排除所有文件和目录
-*
-
-# 例外:保留这些文件
-!.gitignore
-!codeStyles/
-!codeStyles/codeStyleConfig.xml
-!codeStyles/Project.xml
-!/sqldialects.xml
-!/modules/
-!/modules/compose-server.iml
-!/misc.xml
-!/vcs.xml
-!/*.iml
-!/modules.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index bf2d3ab41..000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- GETTERS_AND_SETTERS
- KEEP
-
-
- OVERRIDDEN_METHODS
- KEEP
-
-
- DEPENDENT_METHODS
- BREADTH_FIRST
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index c5678b639..000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/.idea/compose-server.iml b/.idea/compose-server.iml
deleted file mode 100644
index 9895a2175..000000000
--- a/.idea/compose-server.iml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 4925c9519..000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 5b5c0bdc8..000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules/compose-server.iml b/.idea/modules/compose-server.iml
deleted file mode 100644
index 3d828535e..000000000
--- a/.idea/modules/compose-server.iml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
deleted file mode 100644
index 3c9547fad..000000000
--- a/.idea/sqldialects.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddfb..000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 9902093a4..000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "workbench.colorCustomizations": {
- "titleBar.activeBackground": "#d530c41a",
- "titleBar.activeForeground": "#ffffff",
- "titleBar.inactiveBackground": "#b625a81a",
- "titleBar.inactiveForeground": "#f3c4ee",
- "titleBar.border": "#d530c41a"
- }
-}
diff --git a/CODEBUDDY.md b/CODEBUDDY.md
deleted file mode 100644
index bb9e48566..000000000
--- a/CODEBUDDY.md
+++ /dev/null
@@ -1,232 +0,0 @@
-# CODEBUDDY.md
-
-This file provides guidance to CodeBuddy Code when working with the Compose Server repository.
-
-## Project Overview
-
-**Compose Server** is a modern enterprise-grade Kotlin server-side framework library featuring modular architecture design. It provides 30+ specialized modules covering AI integration, object storage, database operations, security, payments, messaging, data processing, and monitoring capabilities. All modules are published to Maven Central for selective integration.
-
-**Technology Stack:** Kotlin 2.2.0, Spring Boot 3.5.4, Jimmer 0.9.105, Gradle 9.x, Java 24+, PostgreSQL, Redis, Caffeine, MinIO, LangChain4j
-
-## Essential Development Commands
-
-### Build and Development
-```bash
-# Build the entire project
-./gradlew build
-
-# Clean build outputs
-./gradlew clean
-
-# Run all tests and checks
-./gradlew check
-
-# Build specific module
-./gradlew :{module}:build
-
-# Run tests for specific module
-./gradlew :{module}:check
-
-# Publish to local Maven repository
-./gradlew publishToMavenLocal
-
-# Publish specific module locally
-./gradlew :{module}:publishToMavenLocal
-```
-
-### Code Quality (REQUIRED before commits)
-```bash
-# Fix code formatting (MUST run before commit)
-./gradlew spotlessApply
-
-# Format version catalog
-./gradlew versionCatalogFormat
-
-# Check for dependency updates
-./gradlew versionCatalogUpdate
-```
-
-### Testing Commands
-```bash
-# Run all tests with parallel execution
-./gradlew test
-
-# Run tests with TestContainers (requires Docker)
-./gradlew integrationTest
-
-# Run specific test class
-./gradlew test --tests "ClassName"
-
-# Run tests with specific profile
-./gradlew test -Dspring.profiles.active=test
-```
-
-## Architecture Overview
-
-### Modular Structure
-The project follows a layered modular architecture with clear functional boundaries:
-
-```
-🎯 Application Layer
- ↓ (selective integration)
-🏢 Business Module Layer (30+ modules)
- ├── 🤖 AI Services (ai-*)
- ├── 📦 Object Storage (oss-*)
- ├── 💳 Payment Services (pay-*)
- ├── 📱 SMS Services (sms-*)
- ├── 🔐 Security (security-*)
- ├── 🗄️ Database (rds-*)
- └── 🔧 Dependencies (depend-*, ksp-*, psdk-*)
- ↓ (all depend on)
-🏗️ Infrastructure Layer
- ├── 🔧 Shared Foundation (shared)
- ├── 📋 Dependency Management (bom)
- ├── 🧪 Testing Toolkit (testtoolkit)
- └── ⚡ Caching Abstractions (cacheable)
-```
-
-### Module Organization Pattern
-Each functional domain follows a consistent structure:
-- `{domain}-shared/`: Core interfaces and abstractions
-- `{domain}-{provider}/`: Provider-specific implementations (e.g., `oss-minio`, `pay-wechat`)
-- `autoconfig/`: Spring Boot auto-configuration classes
-- Package format: `io.github.truenine.composeserver.{module-name}`
-
-### Key Architectural Patterns
-
-#### Auto-Configuration Pattern
-Every module uses Spring Boot auto-configuration with:
-- `AutoConfigEntrance.kt` as entry point in `autoconfig` package
-- `@ComponentScan` for automatic discovery
-- `@EnableConfigurationProperties` for type-safe configuration
-- `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` for registration
-
-#### Repository Pattern
-- `IRepo` interface extending Jimmer's `KRepository`
-- `IPersistentEntity` base interface for all entities
-- Jimmer ORM integration with strong type safety
-
-#### Service Abstractions
-- Unified interfaces like `IObjectStorageService` for multi-provider support
-- Coroutines integration throughout async operations
-- Provider-swappable implementations
-
-## Testing Architecture
-
-### TestContainers Integration
-The project uses comprehensive TestContainers integration:
-- `ITestContainerBase`: Base interface for all containers
-- Specific container interfaces: `IDatabasePostgresqlContainer`, `ICacheRedisContainer`, etc.
-- Automatic container startup via `@DynamicPropertySource`
-- Container reuse enabled for performance
-- Extension functions for convenient testing (e.g., `mysql { }` blocks)
-
-### Test Organization Standards
-- Test classes use `@Nested` inner classes for scenario organization
-- Chinese method names with backticks for test descriptions
-- Disable `@DisplayName` annotation
-- Test categories: normal cases, exception cases, boundary cases
-- Idempotency verification for database operations
-
-### Test Configuration
-```yaml
-# application-test.yml
-compose:
- testtoolkit:
- enabled: true
- disable-condition-evaluation-report: true
- enable-virtual-threads: true
- ansi-output-mode: always
-```
-
-## Build System
-
-### Gradle Configuration
-- **Version Catalog**: `gradle/libs.versions.toml` for unified dependency management
-- **Convention Plugins**: `build-logic/` contains reusable build conventions
-- **Primary Convention**: `kotlinspring-conventions` for most modules
-- **Performance Optimized**: Parallel builds, caching, configuration cache enabled
-
-### Convention Plugins Available
-- `buildlogic.kotlinspring-conventions`: Primary for Kotlin Spring modules
-- `buildlogic.publish-conventions`: Maven Central publishing
-- `buildlogic.spotless-conventions`: Code formatting
-- `buildlogic.jacoco-conventions`: Code coverage
-
-### Key Build Files
-- Root: `build.gradle.kts`, `settings.gradle.kts`, `gradle.properties`
-- Module: `{module}/build.gradle.kts`
-- Version management: `gradle/libs.versions.toml`
-- Build logic: `build-logic/src/main/kotlin/`
-
-## Development Workflow
-
-### Before Every Commit
-1. **MANDATORY**: Run `./gradlew spotlessApply` to fix code formatting
-2. Run `./gradlew check` to ensure all tests pass
-3. Verify module builds independently if changes span multiple modules
-
-### Adding New Modules
-1. Create module directory following naming convention
-2. Add to `settings.gradle.kts` include list
-3. Apply appropriate convention plugins in module's `build.gradle.kts`
-4. Implement auto-configuration in `autoconfig` package
-5. Add to version catalog if publishing to Maven Central
-
-### Code Generation (KSP)
-- Annotation definitions in `ksp-meta/`
-- Processor implementation in `ksp-plugin/`
-- Generated code integration through Gradle KSP plugin
-
-## Key Interfaces and Abstractions
-
-### Core Domain Interfaces
-- `IAnyEnum`: Type-safe enum abstraction for serialization
-- `IPageParam`: Pagination parameter interface
-- `IPersistentEntity`: Base entity with audit fields
-
-### Service Layer Interfaces
-- `IObjectStorageService`: Unified object storage with coroutines
-- `IRepo`: Repository pattern with Jimmer integration
-- `IKeysRepo`: Cryptographic key management
-
-### Configuration Interfaces
-- Properties classes with `@ConfigurationProperties`
-- Environment-specific configuration overrides
-- TestContainer-specific properties
-
-## Maven Central Publishing
-
-All modules are published as `io.github.truenine:composeserver-{module-name}:${version}`
-- Current version managed in `gradle/libs.versions.toml`
-- BOM available for unified version management
-- Selective integration supported - choose only needed modules
-
-## Performance Considerations
-
-### JVM Configuration
-```properties
-# gradle.properties
-org.gradle.jvmargs=-Xmx5g -XX:MaxMetaspaceSize=1g -XX:+UseG1GC
-kotlin.daemon.jvmargs=-Xmx2g -XX:+UseG1GC
-```
-
-### Build Optimizations
-- Parallel builds enabled
-- Gradle build cache enabled
-- Configuration cache enabled
-- Incremental Kotlin compilation
-- JUnit parallel test execution
-
-## IDE Integration
-
-### IntelliJ IDEA Plugin
-- MCP (Model Context Protocol) integration in `ide/ide-idea-mcp/`
-- Code analysis and cleanup tools
-- Terminal integration for development workflows
-
-### Development Setup
-- Java 24+ required
-- Kotlin 2.2.0+ required
-- Docker required for TestContainers integration
-- IntelliJ IDEA recommended with Kotlin plugin
\ No newline at end of file
diff --git a/ai/ai-langchain4j/build.gradle.kts b/ai/ai-langchain4j/build.gradle.kts
index 4244452bb..1edc3e118 100644
--- a/ai/ai-langchain4j/build.gradle.kts
+++ b/ai/ai-langchain4j/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/ai/ai-shared/build.gradle.kts b/ai/ai-shared/build.gradle.kts
index 7b6fec207..6b299768b 100644
--- a/ai/ai-shared/build.gradle.kts
+++ b/ai/ai-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts
index a26794d74..c20bf3842 100644
--- a/bom/build.gradle.kts
+++ b/bom/build.gradle.kts
@@ -2,7 +2,7 @@ import kotlin.jvm.optionals.getOrNull
plugins {
`java-platform`
- id("buildlogic.publish-conventions")
+ id("buildlogic.maven-publish-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/build-logic/src/main/kotlin/buildlogic.java-conventions.gradle.kts b/build-logic/src/main/kotlin/buildlogic.java-conventions.gradle.kts
index 1677b2986..6aa29b687 100644
--- a/build-logic/src/main/kotlin/buildlogic.java-conventions.gradle.kts
+++ b/build-logic/src/main/kotlin/buildlogic.java-conventions.gradle.kts
@@ -2,7 +2,7 @@ val libs = the()
plugins {
`java-library`
- id("buildlogic.publish-conventions")
+ id("buildlogic.maven-publish-conventions")
id("buildlogic.repositories-conventions")
id("buildlogic.jacoco-conventions")
}
diff --git a/build-logic/src/main/kotlin/buildlogic.javaspring-conventions.gradle.kts b/build-logic/src/main/kotlin/buildlogic.java-spring-boot-conventions.gradle.kts
similarity index 100%
rename from build-logic/src/main/kotlin/buildlogic.javaspring-conventions.gradle.kts
rename to build-logic/src/main/kotlin/buildlogic.java-spring-boot-conventions.gradle.kts
diff --git a/build-logic/src/main/kotlin/buildlogic.kotlinspring-conventions.gradle.kts b/build-logic/src/main/kotlin/buildlogic.kotlin-spring-boot-conventions.gradle.kts
similarity index 88%
rename from build-logic/src/main/kotlin/buildlogic.kotlinspring-conventions.gradle.kts
rename to build-logic/src/main/kotlin/buildlogic.kotlin-spring-boot-conventions.gradle.kts
index e20907abe..c391d31e0 100644
--- a/build-logic/src/main/kotlin/buildlogic.kotlinspring-conventions.gradle.kts
+++ b/build-logic/src/main/kotlin/buildlogic.kotlin-spring-boot-conventions.gradle.kts
@@ -1,6 +1,6 @@
val libs = the()
plugins {
- id("buildlogic.javaspring-conventions")
+ id("buildlogic.java-spring-boot-conventions")
id("buildlogic.kotlin-conventions")
kotlin("plugin.spring")
kotlin("kapt")
diff --git a/build-logic/src/main/kotlin/buildlogic.kotlinspring-test-conventions.gradle.kts b/build-logic/src/main/kotlin/buildlogic.kotlin-spring-boot-test-conventions.gradle.kts
similarity index 100%
rename from build-logic/src/main/kotlin/buildlogic.kotlinspring-test-conventions.gradle.kts
rename to build-logic/src/main/kotlin/buildlogic.kotlin-spring-boot-test-conventions.gradle.kts
diff --git a/build-logic/src/main/kotlin/buildlogic.publish-conventions.gradle.kts b/build-logic/src/main/kotlin/buildlogic.maven-publish-conventions.gradle.kts
similarity index 91%
rename from build-logic/src/main/kotlin/buildlogic.publish-conventions.gradle.kts
rename to build-logic/src/main/kotlin/buildlogic.maven-publish-conventions.gradle.kts
index fd9398aaf..b25b0f567 100644
--- a/build-logic/src/main/kotlin/buildlogic.publish-conventions.gradle.kts
+++ b/build-logic/src/main/kotlin/buildlogic.maven-publish-conventions.gradle.kts
@@ -1,7 +1,4 @@
-import com.vanniktech.maven.publish.GradlePlugin
-import com.vanniktech.maven.publish.JavadocJar
-import com.vanniktech.maven.publish.KotlinJvm
-import com.vanniktech.maven.publish.VersionCatalog
+import com.vanniktech.maven.publish.*
val libs = the()
@@ -33,7 +30,7 @@ mavenPublishing {
// Detect the Kotlin JVM plugin (including indirect application)
project.plugins.hasPlugin("org.jetbrains.kotlin.jvm") ||
project.plugins.hasPlugin("buildlogic.kotlin-conventions") ||
- project.plugins.hasPlugin("buildlogic.kotlinspring-conventions") -> {
+ project.plugins.hasPlugin("buildlogic.kotlin-spring-boot-conventions") -> {
configure(
KotlinJvm(
javadocJar = JavadocJar.Empty(),
@@ -63,7 +60,6 @@ mavenPublishing {
inceptionYear = "2020"
developers {
-
developer {
id = "TrueNine"
name = "Zhao Ritian"
@@ -97,6 +93,14 @@ mavenPublishing {
roles = listOf("Sponsor")
timezone = "GMT+8"
}
+ developer {
+ id = "zjarlin"
+ name = "加加林"
+ url = "https://github.com/zjarlin"
+ email = "zjarlin@outlook.com"
+ roles = listOf("Developer", "Partner", "Sponsor")
+ timezone = "GMT+8"
+ }
}
scm {
diff --git a/cacheable/build.gradle.kts b/cacheable/build.gradle.kts
index fb478b692..22ac90618 100644
--- a/cacheable/build.gradle.kts
+++ b/cacheable/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/CaffeineCacheAutoConfiguration.kt b/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/CaffeineCacheAutoConfiguration.kt
index 5e9947a6f..cd9ed3009 100644
--- a/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/CaffeineCacheAutoConfiguration.kt
+++ b/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/CaffeineCacheAutoConfiguration.kt
@@ -6,9 +6,7 @@ import io.github.truenine.composeserver.consts.ICacheNames
import io.github.truenine.composeserver.logger
import java.time.Duration
import org.springframework.cache.caffeine.CaffeineCacheManager
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
private val log = logger()
diff --git a/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/RedisJsonSerializerAutoConfiguration.kt b/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/RedisJsonSerializerAutoConfiguration.kt
index 23a3ab7e1..d965bd19f 100644
--- a/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/RedisJsonSerializerAutoConfiguration.kt
+++ b/cacheable/src/main/kotlin/io/github/truenine/composeserver/cacheable/autoconfig/RedisJsonSerializerAutoConfiguration.kt
@@ -12,9 +12,7 @@ import org.springframework.data.redis.cache.RedisCacheConfiguration
import org.springframework.data.redis.cache.RedisCacheManager
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.core.RedisTemplate
-import org.springframework.data.redis.serializer.GenericJacksonJsonRedisSerializer
-import org.springframework.data.redis.serializer.RedisSerializationContext
-import org.springframework.data.redis.serializer.StringRedisSerializer
+import org.springframework.data.redis.serializer.*
import tools.jackson.databind.DeserializationFeature
import tools.jackson.databind.json.JsonMapper
diff --git a/cacheable/src/test/kotlin/io/github/truenine/composeserver/cacheable/caffeine/CaffeineCacheManagerTest.kt b/cacheable/src/test/kotlin/io/github/truenine/composeserver/cacheable/caffeine/CaffeineCacheManagerTest.kt
index c21d5a401..c55cb01b6 100644
--- a/cacheable/src/test/kotlin/io/github/truenine/composeserver/cacheable/caffeine/CaffeineCacheManagerTest.kt
+++ b/cacheable/src/test/kotlin/io/github/truenine/composeserver/cacheable/caffeine/CaffeineCacheManagerTest.kt
@@ -5,17 +5,10 @@ import io.github.truenine.composeserver.cacheable.get
import io.github.truenine.composeserver.consts.ICacheNames
import io.github.truenine.composeserver.slf4j
import jakarta.annotation.Resource
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertIs
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.cache.CacheManager
+import org.springframework.cache.*
import org.springframework.cache.caffeine.CaffeineCacheManager
-import org.springframework.cache.get
-import org.springframework.cache.set
private val log = slf4j()
diff --git a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/BrowserFns.kt b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/BrowserFns.kt
index da9b0a12e..63069824a 100644
--- a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/BrowserFns.kt
+++ b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/BrowserFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.data.crawler.playwright
-import com.microsoft.playwright.Browser
-import com.microsoft.playwright.BrowserContext
-import com.microsoft.playwright.Page
+import com.microsoft.playwright.*
fun Browser.withActions(ctxOptions: Browser.NewContextOptions? = null, pageOptions: Browser.NewPageOptions? = null, action: (BrowserContext, Page) -> Unit) {
newContext(ctxOptions).use { ctx -> newPage(pageOptions).use { page -> action(ctx, page) } }
diff --git a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PageFns.kt b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PageFns.kt
index 9aec73900..0c8f758dd 100644
--- a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PageFns.kt
+++ b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PageFns.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.data.crawler.playwright
import com.microsoft.playwright.Locator
import com.microsoft.playwright.Locator.WaitForOptions
import com.microsoft.playwright.Page
-import com.microsoft.playwright.options.Cookie
-import com.microsoft.playwright.options.LoadState
-import com.microsoft.playwright.options.WaitForSelectorState
+import com.microsoft.playwright.options.*
@Suppress("UNCHECKED_CAST")
fun Page.localStorage(): Map {
diff --git a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PlayWrightFns.kt b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PlayWrightFns.kt
index ec220b723..daefbeeb1 100644
--- a/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PlayWrightFns.kt
+++ b/data/data-crawler/src/main/kotlin/io/github/truenine/composeserver/data/crawler/playwright/PlayWrightFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.data.crawler.playwright
-import com.microsoft.playwright.Browser
-import com.microsoft.playwright.BrowserType
-import com.microsoft.playwright.Playwright
+import com.microsoft.playwright.*
fun Playwright.launchBy(browserType: BrowserTypes = BrowserTypes.CHROMIUM, headless: Boolean? = false, launchTimeout: Double = 30000.0): Browser {
return browserType.getPlaywrightType(this).launch(BrowserType.LaunchOptions().setHeadless(headless ?: false).setTimeout(launchTimeout))
diff --git a/data/data-extract/build.gradle.kts b/data/data-extract/build.gradle.kts
index 301eef2f4..9652e1355 100644
--- a/data/data-extract/build.gradle.kts
+++ b/data/data-extract/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/data/data-extract/src/main/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressService.kt b/data/data-extract/src/main/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressService.kt
index e0df206e6..412a8044a 100644
--- a/data/data-extract/src/main/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressService.kt
+++ b/data/data-extract/src/main/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressService.kt
@@ -1,10 +1,8 @@
package io.github.truenine.composeserver.data.extract.service
-import io.github.truenine.composeserver.SystemLogger
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.consts.IRegexes
import io.github.truenine.composeserver.data.extract.domain.CnDistrictCode
-import io.github.truenine.composeserver.nonText
-import io.github.truenine.composeserver.string
/**
* Lazy loading administrative district code service interface.
diff --git a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/api/ICnNbsAddressApiTest.kt b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/api/ICnNbsAddressApiTest.kt
index ba39040c8..512901755 100644
--- a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/api/ICnNbsAddressApiTest.kt
+++ b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/api/ICnNbsAddressApiTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.data.extract.api
import jakarta.annotation.Resource
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.springframework.boot.test.context.SpringBootTest
@Ignore
diff --git a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/domain/CnDistrictCodeTest.kt b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/domain/CnDistrictCodeTest.kt
index 85a2d87ab..ae1133389 100644
--- a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/domain/CnDistrictCodeTest.kt
+++ b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/domain/CnDistrictCodeTest.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.data.extract.domain
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
diff --git a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressServiceTest.kt b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressServiceTest.kt
index 7b8c329d9..0471be857 100644
--- a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressServiceTest.kt
+++ b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/ILazyAddressServiceTest.kt
@@ -6,12 +6,7 @@ import io.github.truenine.composeserver.string
import io.mockk.every
import io.mockk.mockk
import kotlin.system.measureTimeMillis
-import kotlin.test.BeforeTest
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.core.io.ByteArrayResource
diff --git a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressCsvServiceImplTest.kt b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressCsvServiceImplTest.kt
index 04c328c6d..99a155731 100644
--- a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressCsvServiceImplTest.kt
+++ b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressCsvServiceImplTest.kt
@@ -4,11 +4,7 @@ import io.github.truenine.composeserver.holders.ResourceHolder
import io.mockk.every
import io.mockk.mockk
import kotlin.system.measureTimeMillis
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.core.io.ByteArrayResource
diff --git a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressServiceImplTest.kt b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressServiceImplTest.kt
index e62b4a26e..9f5f3efc0 100644
--- a/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressServiceImplTest.kt
+++ b/data/data-extract/src/test/kotlin/io/github/truenine/composeserver/data/extract/service/impl/LazyAddressServiceImplTest.kt
@@ -3,10 +3,7 @@ package io.github.truenine.composeserver.data.extract.service.impl
import io.github.truenine.composeserver.data.extract.api.ICnNbsAddressApi
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.Ignore
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
diff --git a/depend/depend-http-exchange/src/main/kotlin/io/github/truenine/composeserver/depend/httpexchange/WebClientFns.kt b/depend/depend-http-exchange/src/main/kotlin/io/github/truenine/composeserver/depend/httpexchange/WebClientFns.kt
index 9843284c6..b9d97b5c0 100644
--- a/depend/depend-http-exchange/src/main/kotlin/io/github/truenine/composeserver/depend/httpexchange/WebClientFns.kt
+++ b/depend/depend-http-exchange/src/main/kotlin/io/github/truenine/composeserver/depend/httpexchange/WebClientFns.kt
@@ -14,9 +14,7 @@ import org.springframework.util.MimeType
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.support.WebClientAdapter
-import org.springframework.web.service.invoker.HttpRequestValues
-import org.springframework.web.service.invoker.HttpServiceArgumentResolver
-import org.springframework.web.service.invoker.HttpServiceProxyFactory
+import org.springframework.web.service.invoker.*
import tools.jackson.databind.ObjectMapper
import tools.jackson.databind.json.JsonMapper
diff --git a/depend/depend-jackson/build.gradle.kts b/depend/depend-jackson/build.gradle.kts
index 3ff583132..a1cf886c4 100644
--- a/depend/depend-jackson/build.gradle.kts
+++ b/depend/depend-jackson/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonAutoConfiguration.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonAutoConfiguration.kt
index a226fefca..8d79a66d3 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonAutoConfiguration.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonAutoConfiguration.kt
@@ -1,10 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.autoconfig
-import com.fasterxml.jackson.annotation.JsonAutoDetect
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties
-import com.fasterxml.jackson.annotation.JsonInclude
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-import com.fasterxml.jackson.annotation.PropertyAccessor
+import com.fasterxml.jackson.annotation.*
import io.github.truenine.composeserver.DateTimeConverter
import io.github.truenine.composeserver.depend.jackson.modules.DatetimeCustomModule
import io.github.truenine.composeserver.depend.jackson.modules.KotlinCustomModule
@@ -18,18 +14,9 @@ import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.Ordered
import org.springframework.core.annotation.Order
-import tools.jackson.databind.AnnotationIntrospector
-import tools.jackson.databind.DefaultTyping
-import tools.jackson.databind.DeserializationFeature
-import tools.jackson.databind.JavaType
-import tools.jackson.databind.ObjectMapper
-import tools.jackson.databind.SerializationFeature
+import tools.jackson.databind.*
import tools.jackson.databind.cfg.MapperConfig
-import tools.jackson.databind.introspect.Annotated
-import tools.jackson.databind.introspect.AnnotatedClass
-import tools.jackson.databind.introspect.AnnotatedMember
-import tools.jackson.databind.introspect.AnnotationIntrospectorPair
-import tools.jackson.databind.introspect.JacksonAnnotationIntrospector
+import tools.jackson.databind.introspect.*
import tools.jackson.databind.json.JsonMapper
import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator
import tools.jackson.databind.jsontype.impl.DefaultTypeResolverBuilder
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/DatetimeCustomModule.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/DatetimeCustomModule.kt
index 6fe927c83..a02221240 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/DatetimeCustomModule.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/DatetimeCustomModule.kt
@@ -1,28 +1,10 @@
package io.github.truenine.composeserver.depend.jackson.modules
-import io.github.truenine.composeserver.depend.jackson.serializers.InstantTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.InstantTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimeTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalTimeTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.OffsetDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.OffsetDateTimeTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.ZonedDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.ZonedDateTimeTimestampSerializer
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.ZonedDateTime
+import io.github.truenine.composeserver.depend.jackson.serializers.*
+import java.time.*
import tools.jackson.databind.ValueDeserializer
import tools.jackson.databind.ValueSerializer
-import tools.jackson.databind.module.SimpleDeserializers
-import tools.jackson.databind.module.SimpleModule
-import tools.jackson.databind.module.SimpleSerializers
+import tools.jackson.databind.module.*
/**
* Custom module for date-time types.
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/KotlinCustomModule.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/KotlinCustomModule.kt
index 8b7d149ae..f26d59142 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/KotlinCustomModule.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/modules/KotlinCustomModule.kt
@@ -1,14 +1,10 @@
package io.github.truenine.composeserver.depend.jackson.modules
-import io.github.truenine.composeserver.depend.jackson.serializers.IPageParamLikeSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.KPairDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.KPairSerializer
+import io.github.truenine.composeserver.depend.jackson.serializers.*
import io.github.truenine.composeserver.domain.IPageParam
import io.github.truenine.composeserver.domain.IPageParamLike
import tools.jackson.core.Version
-import tools.jackson.databind.module.SimpleDeserializers
-import tools.jackson.databind.module.SimpleModule
-import tools.jackson.databind.module.SimpleSerializers
+import tools.jackson.databind.module.*
/**
* Custom Kotlin Jackson module.
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumConverter.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumConverter.kt
index 4098ac397..55e856567 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumConverter.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumConverter.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import io.github.truenine.composeserver.IAnyEnum
-import io.github.truenine.composeserver.IIntEnum
-import io.github.truenine.composeserver.IStringEnum
+import io.github.truenine.composeserver.*
import kotlin.reflect.KClass
import tools.jackson.core.JsonParser
import tools.jackson.core.JsonToken
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumSerializer.kt
index a99c0dcd7..8046b34bf 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/AnyEnumSerializer.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import io.github.truenine.composeserver.IAnyEnum
-import io.github.truenine.composeserver.IIntEnum
-import io.github.truenine.composeserver.IStringEnum
+import io.github.truenine.composeserver.*
import tools.jackson.core.JsonGenerator
import tools.jackson.databind.SerializationContext
import tools.jackson.databind.ValueSerializer
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/IPageParamLikeSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/IPageParamLikeSerializer.kt
index 85c1155fc..3e99bc41b 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/IPageParamLikeSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/IPageParamLikeSerializer.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.Pq
import io.github.truenine.composeserver.domain.IPageParam
import tools.jackson.core.JsonParser
import tools.jackson.core.JsonToken
-import tools.jackson.databind.DatabindException
-import tools.jackson.databind.DeserializationContext
-import tools.jackson.databind.ValueDeserializer
+import tools.jackson.databind.*
/**
* Deserializer for IPageParam and IPageParamLike interfaces.
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Deserializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Deserializer.kt
index 8c3bc82b1..d598eb2ef 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Deserializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Deserializer.kt
@@ -1,12 +1,7 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import io.github.truenine.composeserver.toLocalDate
-import io.github.truenine.composeserver.toLocalDateTime
-import io.github.truenine.composeserver.toLocalTime
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneOffset
+import io.github.truenine.composeserver.*
+import java.time.*
import java.time.temporal.Temporal
import tools.jackson.core.JsonParser
import tools.jackson.databind.DeserializationContext
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Serializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Serializer.kt
index 1dc32e0e5..2517bb4c8 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Serializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601Serializer.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.depend.jackson.serializers
import io.github.truenine.composeserver.toMillis
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneOffset
+import java.time.*
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonToken
import tools.jackson.databind.SerializationContext
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/KPairDeserializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/KPairDeserializer.kt
index 8b33300c7..a6023ef8b 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/KPairDeserializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/KPairDeserializer.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.depend.jackson.serializers
import tools.jackson.core.JsonParser
import tools.jackson.core.JsonToken
-import tools.jackson.databind.DatabindException
-import tools.jackson.databind.DeserializationContext
-import tools.jackson.databind.ValueDeserializer
+import tools.jackson.databind.*
/**
* Kotlin Pair deserializer.
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimeTimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimeTimestampSerializer.kt
index 9c7f16f5b..f7d0cb01b 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimeTimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimeTimestampSerializer.kt
@@ -1,6 +1,5 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneOffset
import tools.jackson.core.JsonGenerator
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimestampSerializer.kt
index 68a20e252..6e02e72e5 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalDateTimestampSerializer.kt
@@ -1,6 +1,5 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
import java.time.LocalDate
import java.time.ZoneOffset
import tools.jackson.core.JsonGenerator
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalTimeTimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalTimeTimestampSerializer.kt
index 5b5136436..d3bde7a69 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalTimeTimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/LocalTimeTimestampSerializer.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalTime
-import java.time.ZoneOffset
+import java.time.*
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonToken
import tools.jackson.databind.SerializationContext
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/OffsetDateTimeTimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/OffsetDateTimeTimestampSerializer.kt
index 75fa92c59..f07546d4d 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/OffsetDateTimeTimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/OffsetDateTimeTimestampSerializer.kt
@@ -1,6 +1,5 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
import java.time.OffsetDateTime
import java.time.ZoneOffset
import tools.jackson.core.JsonGenerator
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampDeserializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampDeserializer.kt
index 260aa358a..84f10cec4 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampDeserializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampDeserializer.kt
@@ -1,12 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
+import java.time.*
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeParseException
import tools.jackson.core.JsonParser
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampSerializer.kt
index 9aa6a685b..0332c4378 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/TimestampSerializer.kt
@@ -1,12 +1,6 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
+import java.time.*
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonToken
import tools.jackson.databind.SerializationContext
diff --git a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ZonedDateTimeTimestampSerializer.kt b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ZonedDateTimeTimestampSerializer.kt
index aa8b27c0e..87809c379 100644
--- a/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ZonedDateTimeTimestampSerializer.kt
+++ b/depend/depend-jackson/src/main/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ZonedDateTimeTimestampSerializer.kt
@@ -1,6 +1,5 @@
package io.github.truenine.composeserver.depend.jackson.serializers
-import java.time.Instant
import java.time.ZoneOffset
import java.time.ZonedDateTime
import tools.jackson.core.JsonGenerator
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializeTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializeTest.kt
index deb6f5f9f..6f17e225c 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializeTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializeTest.kt
@@ -1,10 +1,8 @@
package io.github.truenine.composeserver.depend.jackson
-import io.github.truenine.composeserver.date
-import io.github.truenine.composeserver.datetime
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import io.github.truenine.composeserver.testtoolkit.log
-import io.github.truenine.composeserver.time
import jakarta.annotation.Resource
import kotlin.test.Test
import org.springframework.boot.test.context.SpringBootTest
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializerTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializerTest.kt
index 80d19d9a4..14c699dd9 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializerTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/DatetimeSerializerTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.depend.jackson
import io.github.truenine.composeserver.datetime
import io.github.truenine.composeserver.testtoolkit.log
import jakarta.annotation.Resource
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Disabled
import org.springframework.boot.test.context.SpringBootTest
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationConfigTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationConfigTest.kt
index 7528d7094..3415a417a 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationConfigTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationConfigTest.kt
@@ -5,11 +5,7 @@ import io.github.truenine.composeserver.testtoolkit.log
import jakarta.annotation.Resource
import java.time.Instant
import java.time.LocalDateTime
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.springframework.boot.test.context.SpringBootTest
import tools.jackson.databind.ObjectMapper
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationTest.kt
index ccc2760ac..64095383a 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/JacksonSerializationTest.kt
@@ -3,13 +3,8 @@ package io.github.truenine.composeserver.depend.jackson
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import io.github.truenine.composeserver.testtoolkit.log
import jakarta.annotation.Resource
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.ZoneOffset
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import java.time.*
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.springframework.boot.test.context.SpringBootTest
import tools.jackson.databind.ObjectMapper
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/KotlinModuleCompatibilityTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/KotlinModuleCompatibilityTest.kt
index 7463939ca..99fb8e23a 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/KotlinModuleCompatibilityTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/KotlinModuleCompatibilityTest.kt
@@ -5,9 +5,7 @@ import io.github.truenine.composeserver.testtoolkit.log
import jakarta.annotation.Resource
import java.time.LocalDateTime
import java.time.ZonedDateTime
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializationTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializationTest.kt
index d2b7803d7..670b41266 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializationTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializationTest.kt
@@ -3,18 +3,8 @@ package io.github.truenine.composeserver.depend.jackson
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import io.github.truenine.composeserver.testtoolkit.log
import jakarta.annotation.Resource
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.ZoneId
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import java.time.*
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.springframework.boot.test.context.SpringBootTest
import tools.jackson.databind.ObjectMapper
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializersTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializersTest.kt
index bf68be51b..a577f73ff 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializersTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/TimestampSerializersTest.kt
@@ -1,31 +1,14 @@
package io.github.truenine.composeserver.depend.jackson
-import io.github.truenine.composeserver.depend.jackson.serializers.InstantTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.InstantTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.LocalDateTimeTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.OffsetDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.OffsetDateTimeTimestampSerializer
-import io.github.truenine.composeserver.depend.jackson.serializers.ZonedDateTimeTimestampDeserializer
-import io.github.truenine.composeserver.depend.jackson.serializers.ZonedDateTimeTimestampSerializer
+import io.github.truenine.composeserver.depend.jackson.serializers.*
import io.github.truenine.composeserver.testtoolkit.log
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.OffsetDateTime
-import java.time.ZoneId
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import java.time.*
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import tools.jackson.databind.ObjectMapper
import tools.jackson.databind.json.JsonMapper
-import tools.jackson.databind.module.SimpleDeserializers
-import tools.jackson.databind.module.SimpleModule
-import tools.jackson.databind.module.SimpleSerializers
+import tools.jackson.databind.module.*
/**
* Timestamp serializer tests
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonPropertiesTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonPropertiesTest.kt
index a042c11e2..cee0ef7a1 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonPropertiesTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/autoconfig/JacksonPropertiesTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.depend.jackson.autoconfig
import com.fasterxml.jackson.annotation.JsonInclude
-import org.junit.jupiter.api.Assertions.assertEquals
-import org.junit.jupiter.api.Assertions.assertFalse
-import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601DeserializerTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601DeserializerTest.kt
index ac1929619..5af8ea019 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601DeserializerTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601DeserializerTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.depend.jackson.serializers
import io.github.truenine.composeserver.toMillis
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneOffset
+import java.time.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
diff --git a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601SerializerTest.kt b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601SerializerTest.kt
index d6135f12c..c4806302e 100644
--- a/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601SerializerTest.kt
+++ b/depend/depend-jackson/src/test/kotlin/io/github/truenine/composeserver/depend/jackson/serializers/ISO8601SerializerTest.kt
@@ -1,22 +1,15 @@
package io.github.truenine.composeserver.depend.jackson.serializers
import io.github.truenine.composeserver.toMillis
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneOffset
+import java.time.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.ValueSource
import tools.jackson.databind.ObjectMapper
import tools.jackson.databind.json.JsonMapper
-import tools.jackson.databind.module.SimpleDeserializers
-import tools.jackson.databind.module.SimpleModule
-import tools.jackson.databind.module.SimpleSerializers
+import tools.jackson.databind.module.*
import tools.jackson.module.kotlin.KotlinModule
class ISO8601SerializerTest {
diff --git a/depend/depend-paho/build.gradle.kts b/depend/depend-paho/build.gradle.kts
index 306dd62ec..ccd0f3e57 100644
--- a/depend/depend-paho/build.gradle.kts
+++ b/depend/depend-paho/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/depend/depend-servlet/build.gradle.kts b/depend/depend-servlet/build.gradle.kts
index d70cfd033..561b069de 100644
--- a/depend/depend-servlet/build.gradle.kts
+++ b/depend/depend-servlet/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/annotations/HeadMapping.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/annotations/HeadMapping.kt
index ac042f4c9..bc67be595 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/annotations/HeadMapping.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/annotations/HeadMapping.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.depend.servlet.annotations
import org.springframework.core.annotation.AliasFor
import org.springframework.http.MediaType
-import org.springframework.web.bind.annotation.Mapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestMethod
+import org.springframework.web.bind.annotation.*
/**
* ## HTTP Method HEAD
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/autoconfig/CustomConverterConfiguration.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/autoconfig/CustomConverterConfiguration.kt
index e4fa2a498..d72ebad11 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/autoconfig/CustomConverterConfiguration.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/autoconfig/CustomConverterConfiguration.kt
@@ -1,12 +1,8 @@
package io.github.truenine.composeserver.depend.servlet.autoconfig
-import io.github.truenine.composeserver.depend.servlet.converters.JavaLocalDateConverter
-import io.github.truenine.composeserver.depend.servlet.converters.JavaLocalDateTimeConverter
-import io.github.truenine.composeserver.depend.servlet.converters.JavaLocalTimeConverter
+import io.github.truenine.composeserver.depend.servlet.converters.*
import io.github.truenine.composeserver.slf4j
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
private val log = slf4j(CustomConverterConfiguration::class)
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/AnyEnumConverterFactory.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/AnyEnumConverterFactory.kt
index a3d9c2f1d..6a01512a2 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/AnyEnumConverterFactory.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/AnyEnumConverterFactory.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.depend.servlet.converters
-import io.github.truenine.composeserver.IAnyEnum
-import io.github.truenine.composeserver.IIntEnum
-import io.github.truenine.composeserver.IStringEnum
-import io.github.truenine.composeserver.logger
+import io.github.truenine.composeserver.*
import java.util.concurrent.ConcurrentHashMap
import org.springframework.core.convert.converter.Converter
import org.springframework.core.convert.converter.ConverterFactory
@@ -13,7 +10,7 @@ import org.springframework.core.convert.converter.ConverterFactory
@Deprecated(message = "API burden is too high", level = DeprecationLevel.ERROR)
open class AnyEnumConverterFactory : ConverterFactory {
companion object {
- @JvmStatic private val converters = ConcurrentHashMap, Converter>()
+ @JvmStatic private val converters = ConcurrentHashMap, Converter>()
}
@Suppress("UNCHECKED_CAST")
@@ -27,7 +24,7 @@ open class AnyEnumConverterFactory : ConverterFactory {
} as Converter
}
- private class AnyEnumConverter(targetClass: Class) : Converter {
+ private class AnyEnumConverter(targetClass: Class) : Converter {
private val isString = IStringEnum::class.java.isAssignableFrom(targetClass)
private val isInt = IIntEnum::class.java.isAssignableFrom(targetClass)
private val valueMappingMap = targetClass.enumConstants.associateBy { it?.value }
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateConverter.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateConverter.kt
index 05d893bb0..e557056dc 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateConverter.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateConverter.kt
@@ -7,7 +7,7 @@ import org.springframework.core.convert.converter.Converter
private val log = slf4j(JavaLocalDateConverter::class)
-open class JavaLocalDateConverter : Converter {
+open class JavaLocalDateConverter : Converter {
override fun convert(source: String): LocalDate? {
log.trace("Converting date = {}", source)
return source.toLongOrNull()?.toLocalDate()
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateTimeConverter.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateTimeConverter.kt
index 7a909768c..45d64d25b 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateTimeConverter.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalDateTimeConverter.kt
@@ -7,7 +7,7 @@ import org.springframework.core.convert.converter.Converter
private val log = slf4j(JavaLocalDateTimeConverter::class)
-open class JavaLocalDateTimeConverter : Converter {
+open class JavaLocalDateTimeConverter : Converter {
override fun convert(source: String): LocalDateTime? {
log.trace("Converting date-time = {}", source)
return source.toLongOrNull()?.toLocalDateTime()
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalTimeConverter.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalTimeConverter.kt
index cdfdd4dc8..75aa92e3c 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalTimeConverter.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/JavaLocalTimeConverter.kt
@@ -7,7 +7,7 @@ import org.springframework.core.convert.converter.Converter
private val log = slf4j(JavaLocalTimeConverter::class)
-open class JavaLocalTimeConverter : Converter {
+open class JavaLocalTimeConverter : Converter {
override fun convert(source: String): LocalTime? {
log.trace("Converting time = {}", source)
return source.toLongOrNull()?.toLocalTime()
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/ToolsJacksonHttpMessageConverter.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/ToolsJacksonHttpMessageConverter.kt
index 5a851f45b..087137e60 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/ToolsJacksonHttpMessageConverter.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/converters/ToolsJacksonHttpMessageConverter.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.depend.servlet.converters
import java.lang.reflect.Type
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
-import org.springframework.http.HttpInputMessage
-import org.springframework.http.HttpOutputMessage
-import org.springframework.http.MediaType
+import org.springframework.http.*
import org.springframework.http.converter.AbstractHttpMessageConverter
import org.springframework.http.converter.GenericHttpMessageConverter
import tools.jackson.databind.ObjectMapper
diff --git a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/filter/MDCFilter.kt b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/filter/MDCFilter.kt
index dd352778e..60b0ab76a 100644
--- a/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/filter/MDCFilter.kt
+++ b/depend/depend-servlet/src/main/kotlin/io/github/truenine/composeserver/depend/servlet/filter/MDCFilter.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.depend.servlet.filter
import io.github.truenine.composeserver.depend.servlet.remoteRequestIp
-import jakarta.servlet.Filter
-import jakarta.servlet.FilterChain
-import jakarta.servlet.ServletRequest
-import jakarta.servlet.ServletResponse
+import jakarta.servlet.*
import jakarta.servlet.http.HttpServletRequest
import java.util.*
import org.slf4j.MDC
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletRequestFnsTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletRequestFnsTest.kt
index ecaa62d7c..b28bdff96 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletRequestFnsTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletRequestFnsTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.depend.servlet
import io.github.truenine.composeserver.consts.IHeaders
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.mock.web.MockHttpServletRequest
class HttpServletRequestFnsTest {
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletResponseFnsTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletResponseFnsTest.kt
index c811da838..4c14bc51c 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletResponseFnsTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/HttpServletResponseFnsTest.kt
@@ -4,10 +4,7 @@ import io.github.truenine.composeserver.consts.IHeaders
import io.github.truenine.composeserver.enums.MediaTypes
import java.nio.charset.StandardCharsets
import java.util.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.mock.web.MockHttpServletResponse
class HttpServletResponseFnsTest {
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/IReadableAttachmentFnsTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/IReadableAttachmentFnsTest.kt
index 420eafe7e..840d9adc5 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/IReadableAttachmentFnsTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/IReadableAttachmentFnsTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.depend.servlet
import io.github.truenine.composeserver.domain.IReadableAttachment
import java.nio.charset.StandardCharsets
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.mock.web.MockMultipartFile
class IReadableAttachmentFnsTest {
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/PathVariableTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/PathVariableTest.kt
index e3eeb2d8f..7b0e70231 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/PathVariableTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/PathVariableTest.kt
@@ -8,10 +8,7 @@ import org.springframework.context.annotation.Import
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.get
import org.springframework.test.web.servlet.setup.MockMvcBuilders
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
import org.springframework.web.context.WebApplicationContext
/** # Ensure the parsing nature of pathVariable */
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/SpringResponseEntityFnsTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/SpringResponseEntityFnsTest.kt
index 6af71794c..36647f76d 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/SpringResponseEntityFnsTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/SpringResponseEntityFnsTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.depend.servlet
import java.time.LocalDateTime
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.http.MediaType
class SpringResponseEntityFnsTest {
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/controller/TestGetParameterController.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/controller/TestGetParameterController.kt
index bb60bcd37..f3ef85e72 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/controller/TestGetParameterController.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/controller/TestGetParameterController.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.depend.servlet.controller
import io.github.truenine.composeserver.int
import io.github.truenine.composeserver.string
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("test/getParameter")
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/GetParameterTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/GetParameterTest.kt
index 094827bd4..0d29e7205 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/GetParameterTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/GetParameterTest.kt
@@ -2,12 +2,7 @@ package io.github.truenine.composeserver.depend.servlet.parameter
import io.github.truenine.composeserver.depend.servlet.TestApplication
import jakarta.annotation.Resource
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFails
-import kotlin.test.assertIs
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.apache.catalina.util.URLEncoder
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
@@ -17,10 +12,7 @@ import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.get
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import org.springframework.web.bind.MissingServletRequestParameterException
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
import org.springframework.web.context.WebApplicationContext
import tools.jackson.databind.ObjectMapper
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/UploadFileParamAssertTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/UploadFileParamAssertTest.kt
index f4d8f4ca8..2e03fe7c9 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/UploadFileParamAssertTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/parameter/UploadFileParamAssertTest.kt
@@ -14,10 +14,7 @@ import org.springframework.mock.web.MockPart
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.multipart
import org.springframework.test.web.servlet.setup.MockMvcBuilders
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestPart
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
import org.springframework.web.context.WebApplicationContext
import org.springframework.web.multipart.MultipartFile
diff --git a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/resolvers/IPageParamLikeArgumentResolverTest.kt b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/resolvers/IPageParamLikeArgumentResolverTest.kt
index eb79aa351..9d34400d3 100644
--- a/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/resolvers/IPageParamLikeArgumentResolverTest.kt
+++ b/depend/depend-servlet/src/test/kotlin/io/github/truenine/composeserver/depend/servlet/resolvers/IPageParamLikeArgumentResolverTest.kt
@@ -3,13 +3,8 @@ package io.github.truenine.composeserver.depend.servlet.resolvers
import io.github.truenine.composeserver.Pq
import io.github.truenine.composeserver.domain.IPageParam
import io.github.truenine.composeserver.domain.IPageParamLike
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import io.mockk.*
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.springframework.core.MethodParameter
import org.springframework.test.web.servlet.MockMvc
diff --git a/depend/depend-springdoc-openapi/build.gradle.kts b/depend/depend-springdoc-openapi/build.gradle.kts
index a421f94a5..30064de46 100644
--- a/depend/depend-springdoc-openapi/build.gradle.kts
+++ b/depend/depend-springdoc-openapi/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/autoconfig/OpenApiDocConfig.kt b/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/autoconfig/OpenApiDocConfig.kt
index 44ad937ea..28992bcd1 100644
--- a/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/autoconfig/OpenApiDocConfig.kt
+++ b/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/autoconfig/OpenApiDocConfig.kt
@@ -10,9 +10,7 @@ import io.swagger.v3.oas.models.media.Schema
import io.swagger.v3.oas.models.media.StringSchema
import io.swagger.v3.oas.models.parameters.HeaderParameter
import jakarta.annotation.PostConstruct
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
+import java.time.*
import java.util.*
import org.springdoc.core.models.GroupedOpenApi
import org.springdoc.core.utils.SpringDocUtils
diff --git a/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/properties/SpringdocOpenApiProperties.kt b/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/properties/SpringdocOpenApiProperties.kt
index ba54468fb..658bb241c 100644
--- a/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/properties/SpringdocOpenApiProperties.kt
+++ b/depend/depend-springdoc-openapi/src/main/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/properties/SpringdocOpenApiProperties.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.depend.springdocopenapi.properties
import io.github.truenine.composeserver.consts.SpringBootConfigurationPropertiesPrefixes
-import org.springframework.boot.context.properties.ConfigurationProperties
-import org.springframework.boot.context.properties.ConfigurationPropertiesBinding
-import org.springframework.boot.context.properties.NestedConfigurationProperty
+import org.springframework.boot.context.properties.*
@ConfigurationPropertiesBinding
@ConfigurationProperties(prefix = SpringBootConfigurationPropertiesPrefixes.DEPEND_SPRINGDOC_OPENAPI, ignoreUnknownFields = true)
diff --git a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/ApiEndpointsTest.kt b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/ApiEndpointsTest.kt
index a3dc3bf24..b6ba94248 100644
--- a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/ApiEndpointsTest.kt
+++ b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/ApiEndpointsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.depend.springdocopenapi
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.DisplayName
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.http.MediaType
diff --git a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/BeanSetupTest.kt b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/BeanSetupTest.kt
index 86b836cc8..f6b700a1c 100644
--- a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/BeanSetupTest.kt
+++ b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/BeanSetupTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.depend.springdocopenapi
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.http.MediaType
diff --git a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/OpenApiConfigTest.kt b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/OpenApiConfigTest.kt
index 329f4971c..7f1c81fec 100644
--- a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/OpenApiConfigTest.kt
+++ b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/OpenApiConfigTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.depend.springdocopenapi.autoconfig.OpenA
import io.github.truenine.composeserver.depend.springdocopenapi.properties.SpringdocOpenApiProperties
import io.swagger.v3.oas.models.OpenAPI
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springdoc.core.models.GroupedOpenApi
diff --git a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/PropertiesTest.kt b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/PropertiesTest.kt
index 19046ac59..70570a64d 100644
--- a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/PropertiesTest.kt
+++ b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/PropertiesTest.kt
@@ -1,13 +1,8 @@
package io.github.truenine.composeserver.depend.springdocopenapi
-import io.github.truenine.composeserver.depend.springdocopenapi.properties.JwtHeaderInfoProperties
-import io.github.truenine.composeserver.depend.springdocopenapi.properties.SpringdocOpenApiProperties
-import io.github.truenine.composeserver.depend.springdocopenapi.properties.SwaggerDescInfo
+import io.github.truenine.composeserver.depend.springdocopenapi.properties.*
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.TestPropertySource
diff --git a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/TestApplication.kt b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/TestApplication.kt
index 944c16254..7eb83b8d2 100644
--- a/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/TestApplication.kt
+++ b/depend/depend-springdoc-openapi/src/test/kotlin/io/github/truenine/composeserver/depend/springdocopenapi/TestApplication.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.depend.springdocopenapi
import io.github.truenine.composeserver.depend.springdocopenapi.autoconfig.AutoConfigEntrance
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.Import
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
@SpringBootApplication @Import(AutoConfigEntrance::class) class TestApplication
diff --git a/depend/depend-xxl-job/build.gradle.kts b/depend/depend-xxl-job/build.gradle.kts
index 0abbeea54..8db28e191 100644
--- a/depend/depend-xxl-job/build.gradle.kts
+++ b/depend/depend-xxl-job/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/docsite/build.gradle.kts b/docsite/build.gradle.kts
index 2447e5590..ff7168805 100644
--- a/docsite/build.gradle.kts
+++ b/docsite/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-test-conventions")
+ id("buildlogic.kotlin-spring-boot-test-conventions")
id("buildlogic.spotless-conventions")
alias(libs.plugins.org.springframework.boot)
alias(libs.plugins.com.google.devtools.ksp)
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index b5bfa9fad..61d204c0f 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,63 +1,64 @@
[versions]
-ch-qos-logback = "1.5.21"
+ch-qos-logback = "1.5.23"
cn-dev33-sa-token = "1.44.0"
-cn-hutool = "5.8.41"
+cn-hutool = "5.8.42"
com-alibaba-cloud = "2023.0.3.3"
-com-baomidou-mybatis-plus = "3.5.14"
+com-baomidou-mybatis-plus = "3.5.15"
com-diffplug-spotless = "8.1.0"
com-fasterxml-jackson2 = "2.20.1"
com-fasterxml-jackson3 = "3.0-rc5"
-com-flywaydb-flyway = "11.17.1"
+com-flywaydb-flyway = "11.20.0"
com-github-tschuchortdev-kotlin-compile-testing = "1.6.0"
-com-google-devtools-ksp = "2.3.3"
+com-google-devtools-ksp = "2.3.4"
com-mapstruct = "1.6.3"
com-querydsl = "5.1.0"
com-squareup-kotlinpoet = "2.2.0"
com-squareup-okio = "3.16.4"
com-vanniktech-maven-publish = "0.35.0"
-com-xuxueli-xxl-job = "3.2.0"
-com-yomahub-liteflow = "2.15.1"
+com-xuxueli-xxl-job = "3.3.1"
+com-yomahub-liteflow = "2.15.2"
dev-langchain4j-community = "1.1.0-beta7"
group = "io.github.truenine"
intellij-platform = "2025.2.1"
intellij-platform-ide = "243"
intellij-platform-plugin-java = "21"
-io-netty = "4.2.7.Final"
+io-netty = "4.2.9.Final"
java = "17"
net-sf-sevenzipjbinding = "16.02-2.01"
nl-littlerobots-version-catalog-updat-gradle-plugin = "1.0.1"
-org-apache-commons-exec = "1.5.0"
-org-apache-groovy = "5.0.2"
-org-apache-logging-log4j = "2.25.2"
+org-apache-commons-exec = "1.6.0"
+org-apache-groovy = "5.0.3"
+org-apache-logging-log4j = "2.25.3"
org-assertj = "4.0.0-M1"
org-awaitility = "4.3.0"
-org-babyfish-jimmer = "0.9.116"
+org-babyfish-jimmer = "0.9.119"
org-gradle = "9.2.1"
-tools-jackson = "3.0.2"
-org-hibernate-orm = "7.2.0.CR2"
+tools-jackson = "3.0.3"
+org-hibernate-orm = "7.2.0.Final"
org-jetbrains-dokka = "2.1.0"
-org-jetbrains-intellij-platform = "2.10.4"
-org-jetbrains-kotlin = "2.3.0-RC"
+org-jetbrains-intellij-platform = "2.10.5"
+org-jetbrains-kotlin = "2.3.0"
org-jetbrains-kotlinx-coroutines = "1.10.2"
org-jetbrains-kotlinx-datetime = "0.7.1-0.6.x-compat"
-org-jetbrains-kotlinx-io = "0.8.1"
-org-jetbrains-kotlinx-serialization = "1.9.0"
+org-jetbrains-kotlinx-io = "0.8.2"
+org-jetbrains-kotlinx-serialization = "1.10.0-RC"
org-junit-jupiter = "6.1.0-M1"
+io-kotest = "6.0.7"
org-liquibase = "5.0.1"
org-slf4j = "2.1.0-alpha1"
-org-springframework-ai = "1.1.0"
-org-springframework-batch = "6.0.0"
-org-springframework-boot = "4.0.0"
+org-springframework-ai = "2.0.0-M1"
+org-springframework-batch = "6.0.1"
+org-springframework-boot = "4.0.1"
org-springframework-cloud = "2025.0.0"
-org-springframework-data = "4.0.0"
-org-springframework-framework = "7.0.1"
-org-springframework-integration = "7.0.0"
-org-springframework-modulith = "2.0.0"
-org-springframework-security = "7.0.0"
-org-testcontainers = "1.21.3"
+org-springframework-data = "4.0.1"
+org-springframework-framework = "7.0.2"
+org-springframework-integration = "7.0.1"
+org-springframework-modulith = "2.0.1"
+org-springframework-security = "7.0.2"
+org-testcontainers = "1.21.4"
org-testng = "7.11.0"
-project = "0.0.49"
-com-netflix-dgs-codegen = "8.2.1"
+project = "2025.12.26"
+com-netflix-dgs-codegen = "8.3.0"
[libraries]
com-netflix-dgs-codegen-com-netflix-dgs-codegen-gradle-plugin = { module = "com.netflix.dgs.codegen:com.netflix.dgs.codegen.gradle.plugin", version.ref = "com-netflix-dgs-codegen" }
@@ -75,7 +76,7 @@ cn-hutool-hutool-db = { module = "cn.hutool:hutool-db", version.ref = "cn-hutool
cn-idev-excel-fastexcel = "cn.idev.excel:fastexcel:1.3.0"
com-alibaba-cloud-spring-cloud-alibaba-dependencies = { module = "com.alibaba.cloud:spring-cloud-alibaba-dependencies", version.ref = "com-alibaba-cloud" }
com-alibaba-easyexcel = "com.alibaba:easyexcel:4.0.3"
-com-aliyun-oss-aliyun-sdk-oss = "com.aliyun.oss:aliyun-sdk-oss:3.18.3"
+com-aliyun-oss-aliyun-sdk-oss = "com.aliyun.oss:aliyun-sdk-oss:3.18.4"
com-auth0-java-jwt = "com.auth0:java-jwt:4.5.0"
tools-jackson-core-jackson-databind = { module = "tools.jackson.core:jackson-databind", version.ref = "tools-jackson" }
org-jspecify-jspecify = "org.jspecify:jspecify:1.0.0"
@@ -102,7 +103,7 @@ com-github-junrar-junrar = "com.github.junrar:junrar:7.5.7"
com-github-magese-ik-analyzer = "com.github.magese:ik-analyzer:8.5.0"
com-github-tschuchortdev-kotlin-compile-testing = { module = "com.github.tschuchortdev:kotlin-compile-testing", version.ref = "com-github-tschuchortdev-kotlin-compile-testing" }
com-github-tschuchortdev-kotlin-compile-testing-ksp = { module = "com.github.tschuchortdev:kotlin-compile-testing-ksp", version.ref = "com-github-tschuchortdev-kotlin-compile-testing" }
-com-github-ulisesbocchio-jasypt-spring-boot-starter = "com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5"
+com-github-ulisesbocchio-jasypt-spring-boot-starter = "com.github.ulisesbocchio:jasypt-spring-boot-starter:4.0.3"
com-github-wechatpay-apiv3-wechatpay-java = "com.github.wechatpay-apiv3:wechatpay-java:0.2.17"
com-github-xiaoymin-knife4j-openapi3-jakarta-spring-boot-starter = "com.github.xiaoymin:knife4j-openapi3-jakarta-spring-boot-starter:4.5.0"
com-github-xiaoymin-knife4j-spring-boot-starter = "com.github.xiaoymin:knife4j-spring-boot-starter:3.0.3"
@@ -114,7 +115,7 @@ com-h2database-h2 = "com.h2database:h2:2.4.240"
com-hikvision-ga-artemis-http-client = "com.hikvision.ga:artemis-http-client:1.1.3"
com-hikvision-ga-opensource = "com.hikvision.ga:opensource:0.0.3"
com-huaweicloud-esdk-obs-java = "com.huaweicloud:esdk-obs-java:3.25.10"
-com-microsoft-playwright-playwright = "com.microsoft.playwright:playwright:1.56.0"
+com-microsoft-playwright-playwright = "com.microsoft.playwright:playwright:1.57.0"
com-mysql-mysql-connector-j = "com.mysql:mysql-connector-j:9.5.0"
com-querydsl-querydsl-apt = { module = "com.querydsl:querydsl-apt", version.ref = "com-querydsl" }
com-querydsl-querydsl-core = { module = "com.querydsl:querydsl-core", version.ref = "com-querydsl" }
@@ -128,16 +129,16 @@ com-squareup-okio-okio-jvm = { module = "com.squareup.okio:okio-jvm", version.re
com-squareup-retrofit2-retrofit = "com.squareup.retrofit2:retrofit:3.0.0"
com-tencentcloudapi-tencentcloud-sdk-java-sms = "com.tencentcloudapi:tencentcloud-sdk-java-sms:3.1.1357"
com-vanniktech-maven-publish-com-vanniktech-maven-publish-gradle-plugin = { module = "com.vanniktech.maven.publish:com.vanniktech.maven.publish.gradle.plugin", version.ref = "com-vanniktech-maven-publish" }
-com-volcengine-ve-tos-java-sdk = "com.volcengine:ve-tos-java-sdk:2.9.5"
+com-volcengine-ve-tos-java-sdk = "com.volcengine:ve-tos-java-sdk:2.9.8"
com-xuxueli-xxl-job-core = { module = "com.xuxueli:xxl-job-core", version.ref = "com-xuxueli-xxl-job" }
com-yomahub-liteflow-spring-boot-starter = { module = "com.yomahub:liteflow-spring-boot-starter", version.ref = "com-yomahub-liteflow" }
-dev-langchain4j-langchain4j = "dev.langchain4j:langchain4j:1.8.0"
+dev-langchain4j-langchain4j = "dev.langchain4j:langchain4j:1.10.0"
dev-langchain4j-langchain4j-bom = "dev.langchain4j:langchain4j-bom:1.2.0"
dev-langchain4j-langchain4j-community-bom = { module = "dev.langchain4j:langchain4j-community-bom", version.ref = "dev-langchain4j-community" }
dev-langchain4j-langchain4j-hugging-face = { module = "dev.langchain4j:langchain4j-hugging-face", version.ref = "dev-langchain4j-community" }
dev-langchain4j-langchain4j-kotlin = { module = "dev.langchain4j:langchain4j-kotlin", version.ref = "dev-langchain4j-community" }
dev-langchain4j-langchain4j-mcp = { module = "dev.langchain4j:langchain4j-mcp", version.ref = "dev-langchain4j-community" }
-dev-langchain4j-langchain4j-ollama = "dev.langchain4j:langchain4j-ollama:1.8.0"
+dev-langchain4j-langchain4j-ollama = "dev.langchain4j:langchain4j-ollama:1.10.0"
dev-langchain4j-langchain4j-ollama-spring-boot-starter = { module = "dev.langchain4j:langchain4j-ollama-spring-boot-starter", version.ref = "dev-langchain4j-community" }
dev-langchain4j-langchain4j-pgvector = { module = "dev.langchain4j:langchain4j-pgvector", version.ref = "dev-langchain4j-community" }
dev-langchain4j-langchain4j-reactor = { module = "dev.langchain4j:langchain4j-reactor", version.ref = "dev-langchain4j-community" }
@@ -184,30 +185,33 @@ io-github-truenine-composeserver-testtoolkit-springmvc = { module = "io.github.t
io-github-truenine-composeserver-testtoolkit-testcontainers = { module = "io.github.truenine:composeserver-testtoolkit-testcontainers", version.ref = "project" }
io-netty-netty-bom = { module = "io.netty:netty-bom", version.ref = "io-netty" }
io-jsonwebtoken-jjwt-api = "io.jsonwebtoken:jjwt-api:0.13.0"
+io-kotest-kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "io-kotest" }
+io-kotest-kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "io-kotest" }
+io-kotest-kotest-property = { module = "io.kotest:kotest-property", version.ref = "io-kotest" }
io-minio-minio = "io.minio:minio:8.6.0"
-io-mockk-mockk = "io.mockk:mockk:1.14.6"
+io-mockk-mockk = "io.mockk:mockk:1.14.7"
io-netty-netty-handler = { module = "io.netty:netty-handler", version.ref = "io-netty" }
io-projectreactor-kotlin-reactor-kotlin-extensions = "io.projectreactor.kotlin:reactor-kotlin-extensions:1.3.0"
-io-projectreactor-reactor-test = "io.projectreactor:reactor-test:3.8.0"
+io-projectreactor-reactor-test = "io.projectreactor:reactor-test:3.8.1"
io-spring-gradle-dependency-management-plugin = "io.spring.gradle:dependency-management-plugin:1.1.7"
-io-swagger-core-v3-swagger-annotations-jakarta = "io.swagger.core.v3:swagger-annotations-jakarta:2.2.40"
+io-swagger-core-v3-swagger-annotations-jakarta = "io.swagger.core.v3:swagger-annotations-jakarta:2.2.41"
jakarta-annotation-jakarta-annotation-api = "jakarta.annotation:jakarta.annotation-api:3.0.0"
jakarta-inject-jakarta-inject-api = "jakarta.inject:jakarta.inject-api:2.0.1"
jakarta-persistence-jakarta-persistence-api = "jakarta.persistence:jakarta.persistence-api:3.2.0"
jakarta-servlet-jakarta-servlet-api = "jakarta.servlet:jakarta.servlet-api:6.1.0"
jakarta-validation-jakarta-validation-api = "jakarta.validation:jakarta.validation-api:4.0.0-M1"
mysql-mysql-connector-java = "mysql:mysql-connector-java:8.0.33"
-net-bytebuddy-byte-buddy = "net.bytebuddy:byte-buddy:1.18.1"
+net-bytebuddy-byte-buddy = "net.bytebuddy:byte-buddy:1.18.3"
net-sf-dozer-dozer = "net.sf.dozer:dozer:5.5.1"
net-sf-sevenzipjbinding-sevenzipjbinding = { module = "net.sf.sevenzipjbinding:sevenzipjbinding", version.ref = "net-sf-sevenzipjbinding" }
net-sf-sevenzipjbinding-sevenzipjbinding-all-platforms = { module = "net.sf.sevenzipjbinding:sevenzipjbinding-all-platforms", version.ref = "net-sf-sevenzipjbinding" }
net-sf-supercsv-super-csv = "net.sf.supercsv:super-csv:2.4.0"
nl-littlerobots-version-catalog-update-nl-littlerobots-version-catalog-update-gradle-plugin = { module = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin", version.ref = "nl-littlerobots-version-catalog-updat-gradle-plugin" }
-ognl-ognl = "ognl:ognl:3.4.8"
+ognl-ognl = "ognl:ognl:3.4.9"
org-apache-commons-commons-compress = "org.apache.commons:commons-compress:1.28.0"
org-apache-commons-commons-csv = "org.apache.commons:commons-csv:1.14.1"
org-apache-commons-commons-exec = { module = "org.apache.commons:commons-exec", version.ref = "org-apache-commons-exec" }
-org-apache-commons-commons-pool2 = "org.apache.commons:commons-pool2:2.12.1"
+org-apache-commons-commons-pool2 = "org.apache.commons:commons-pool2:2.13.0"
org-apache-groovy = { module = "org.apache.groovy:groovy", version.ref = "org-apache-groovy" }
org-apache-groovy-bom = { module = "org.apache.groovy:groovy-bom", version.ref = "org-apache-groovy" }
org-apache-logging-log4j-log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "org-apache-logging-log4j" }
@@ -223,10 +227,10 @@ org-babyfish-jimmer-jimmer-mapstruct-apt = { module = "org.babyfish.jimmer:jimme
org-babyfish-jimmer-jimmer-spring-boot-starter = { module = "org.babyfish.jimmer:jimmer-spring-boot-starter", version.ref = "org-babyfish-jimmer" }
org-babyfish-jimmer-jimmer-sql = { module = "org.babyfish.jimmer:jimmer-sql", version.ref = "org-babyfish-jimmer" }
org-babyfish-jimmer-jimmer-sql-kotlin = { module = "org.babyfish.jimmer:jimmer-sql-kotlin", version.ref = "org-babyfish-jimmer" }
-org-bouncycastle-bcprov-jdk18on = "org.bouncycastle:bcprov-jdk18on:1.82"
-org-casbin-casbin-spring-boot-starter = "org.casbin:casbin-spring-boot-starter:1.9.0"
+org-bouncycastle-bcprov-jdk18on = "org.bouncycastle:bcprov-jdk18on:1.83"
+org-casbin-casbin-spring-boot-starter = "org.casbin:casbin-spring-boot-starter:2.0.0"
org-casbin-casbin-spring-security-starter = "org.casbin:casbin-spring-security-starter:1.1.0"
-org-casbin-jcasbin = "org.casbin:jcasbin:1.85.1"
+org-casbin-jcasbin = "org.casbin:jcasbin:1.86.0"
org-eclipse-paho-client-mqttv3 = "org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5"
org-flywaydb-flyway-core = { module = "org.flywaydb:flyway-core", version.ref = "com-flywaydb-flyway" }
org-flywaydb-flyway-database-postgresql = { module = "org.flywaydb:flyway-database-postgresql", version.ref = "com-flywaydb-flyway" }
@@ -234,7 +238,7 @@ org-flywaydb-flyway-mysql = { module = "org.flywaydb:flyway-mysql", version.ref
org-freemarker-freemarker = "org.freemarker:freemarker:2.3.34"
org-hibernate-orm-hibernate-core = { module = "org.hibernate:hibernate-core", version.ref = "org-hibernate-orm" }
org-hsqldb-hsqldb = "org.hsqldb:hsqldb:2.7.4"
-org-htmlunit-neko-htmlunit = "org.htmlunit:neko-htmlunit:4.18.0"
+org-htmlunit-neko-htmlunit = "org.htmlunit:neko-htmlunit:4.20.0"
org-jetbrains-annotations = "org.jetbrains:annotations:26.0.2-1"
org-jetbrains-dokka-dokka-gradle-plugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "org-jetbrains-dokka" }
org-jetbrains-intellij-platform-gradle-plugin = { module = "org.jetbrains.intellij.platform:org.jetbrains.intellij.platform.gradle.plugin", version.ref = "org-jetbrains-intellij-platform" }
@@ -272,14 +276,14 @@ org-junit-jupiter-junit-jupiter-params = { module = "org.junit.jupiter:junit-jup
org-junit-platform-junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "org-junit-jupiter" }
org-junit-platform-junit-platform-suite = { module = "org.junit.platform:junit-platform-suite", version.ref = "org-junit-jupiter" }
org-junit-vintage-junit-vintage-engine = { module = "org.junit.vintage:junit-vintage-engine", version.ref = "org-junit-jupiter" }
-org-lionsoul-ip2region = "org.lionsoul:ip2region:3.1.1"
+org-lionsoul-ip2region = "org.lionsoul:ip2region:3.3.2"
org-liquibase-liquibase-core = { module = "org.liquibase:liquibase-core", version.ref = "org-liquibase" }
org-mapstruct-mapstruct = { module = "org.mapstruct:mapstruct", version.ref = "com-mapstruct" }
org-mapstruct-mapstruct-processor = { module = "org.mapstruct:mapstruct-processor", version.ref = "com-mapstruct" }
org-owasp-antisamy-antisamy = "org.owasp.antisamy:antisamy:1.7.8"
org-postgresql-postgresql = "org.postgresql:postgresql:42.7.8"
org-projectlombok-lombok = "org.projectlombok:lombok:1.18.42"
-org-seleniumhq-selenium-selenium-java = "org.seleniumhq.selenium:selenium-java:4.38.0"
+org-seleniumhq-selenium-selenium-java = "org.seleniumhq.selenium:selenium-java:4.39.0"
org-skyscreamer-jsonassert = "org.skyscreamer:jsonassert:2.0-rc1"
org-slf4j-slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "org-slf4j" }
org-springdoc-springdoc-openapi-starter-webmvc-ui = "org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.0"
@@ -323,7 +327,7 @@ org-springframework-boot-spring-boot-starter-websocket = { module = "org.springf
org-springframework-boot-spring-boot-test = { module = "org.springframework.boot:spring-boot-test", version.ref = "org-springframework-boot" }
org-springframework-boot-spring-boot-test-autoconfigure = { module = "org.springframework.boot:spring-boot-test-autoconfigure", version.ref = "org-springframework-boot" }
org-springframework-cloud-spring-cloud-dependencies = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "org-springframework-cloud" }
-org-springframework-cloud-spring-cloud-starter-bootstrap = "org.springframework.cloud:spring-cloud-starter-bootstrap:5.0.0-RC1"
+org-springframework-cloud-spring-cloud-starter-bootstrap = "org.springframework.cloud:spring-cloud-starter-bootstrap:5.0.0"
org-springframework-data-spring-data-commons = { module = "org.springframework.data:spring-data-commons", version.ref = "org-springframework-data" }
org-springframework-data-spring-data-jpa = { module = "org.springframework.data:spring-data-jpa", version.ref = "org-springframework-data" }
org-springframework-integration-spring-integration-core = { module = "org.springframework.integration:spring-integration-core", version.ref = "org-springframework-integration" }
@@ -351,7 +355,7 @@ org-testcontainers-postgresql = { module = "org.testcontainers:postgresql", vers
org-testcontainers-testcontainers = { module = "org.testcontainers:testcontainers", version.ref = "org-testcontainers" }
org-testcontainers-testcontainers-bom = { module = "org.testcontainers:testcontainers-bom", version.ref = "org-testcontainers" }
org-testng-testng = { module = "org.testng:testng", version.ref = "org-testng" }
-org-xerial-sqlite-jdbc = "org.xerial:sqlite-jdbc:3.51.0.0"
+org-xerial-sqlite-jdbc = "org.xerial:sqlite-jdbc:3.51.1.0"
p6spy-p6spy = "p6spy:p6spy:3.9.1"
[plugins]
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 23449a2b5..2a1bb9dd7 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-rc-2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/gradleplugin/gradleplugin-composeserver/build.gradle.kts b/gradleplugin/gradleplugin-composeserver/build.gradle.kts
index f92d96c6e..7619ae5ee 100644
--- a/gradleplugin/gradleplugin-composeserver/build.gradle.kts
+++ b/gradleplugin/gradleplugin-composeserver/build.gradle.kts
@@ -1,7 +1,7 @@
plugins {
`java-gradle-plugin`
id("buildlogic.kotlin-conventions")
- id("buildlogic.publish-conventions")
+ id("buildlogic.maven-publish-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/GradleExtensions.kt b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/GradleExtensions.kt
index 7bdf4358d..a583c7dfc 100644
--- a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/GradleExtensions.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/GradleExtensions.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.gradleplugin
-import io.github.truenine.composeserver.gradleplugin.consts.Constant
-import io.github.truenine.composeserver.gradleplugin.consts.GradleProjectDelegator
-import io.github.truenine.composeserver.gradleplugin.consts.MavenRepositoryUrls
+import io.github.truenine.composeserver.gradleplugin.consts.*
import java.net.URI
import org.gradle.api.Project
import org.gradle.api.artifacts.MinimalExternalModuleDependency
diff --git a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/generator/GradleGenerator.kt b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/generator/GradleGenerator.kt
index 8ef4646ed..f801f15d1 100644
--- a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/generator/GradleGenerator.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/generator/GradleGenerator.kt
@@ -1,12 +1,8 @@
package io.github.truenine.composeserver.gradleplugin.generator
-import io.github.truenine.composeserver.gradleplugin.consts.Constant
-import io.github.truenine.composeserver.gradleplugin.consts.MavenRepos
-import io.github.truenine.composeserver.gradleplugin.consts.MavenRepositoryUrls
+import io.github.truenine.composeserver.gradleplugin.consts.*
import io.github.truenine.composeserver.gradleplugin.wrap
-import java.io.File
-import java.io.FileWriter
-import java.io.InputStreamReader
+import java.io.*
import javax.inject.Inject
import org.gradle.api.Project
diff --git a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtension.kt b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtension.kt
index 8465eeb7d..4672ed65f 100644
--- a/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtension.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtension.kt
@@ -6,9 +6,7 @@ import org.gradle.api.Project
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.bundling.Jar
-import org.gradle.kotlin.dsl.extra
-import org.gradle.kotlin.dsl.named
-import org.gradle.kotlin.dsl.register
+import org.gradle.kotlin.dsl.*
import org.springframework.boot.gradle.tasks.bundling.BootJar
class JarExtension(private val project: Project, private val dsl: JarExtensionConfig) {
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/FunctionsTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/FunctionsTest.kt
index 83e610a2d..9b00cb618 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/FunctionsTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/FunctionsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.gradleplugin
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.gradle.testfixtures.ProjectBuilder
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/GradlePluginTestSuite.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/GradlePluginTestSuite.kt
index b599118da..3a86c9683 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/GradlePluginTestSuite.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/GradlePluginTestSuite.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.gradleplugin
import io.github.truenine.composeserver.gradleplugin.consts.ConstantTest
import io.github.truenine.composeserver.gradleplugin.consts.GradleProjectDelegatorTest
-import io.github.truenine.composeserver.gradleplugin.dotenv.DotenvConfigTest
-import io.github.truenine.composeserver.gradleplugin.dotenv.DotenvIntegrationTest
-import io.github.truenine.composeserver.gradleplugin.dotenv.DotenvLoaderTest
+import io.github.truenine.composeserver.gradleplugin.dotenv.*
import io.github.truenine.composeserver.gradleplugin.entrance.ConfigEntranceTest
import io.github.truenine.composeserver.gradleplugin.generator.GradleGeneratorConfigTest
import io.github.truenine.composeserver.gradleplugin.generator.MavenRepoTypeTest
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/consts/GradleProjectDelegatorTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/consts/GradleProjectDelegatorTest.kt
index 6449dbf8c..d042f1971 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/consts/GradleProjectDelegatorTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/consts/GradleProjectDelegatorTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.gradleplugin.consts
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.gradle.testfixtures.ProjectBuilder
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvConfigTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvConfigTest.kt
index 183973a15..6168c32ea 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvConfigTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvConfigTest.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.gradleplugin.dotenv
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvLoaderTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvLoaderTest.kt
index 7579521c0..8797a809f 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvLoaderTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvLoaderTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.gradleplugin.dotenv
import java.io.File
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.gradle.api.Project
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.testing.Test
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/entrance/ConfigEntranceTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/entrance/ConfigEntranceTest.kt
index feedf5d55..ad6246696 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/entrance/ConfigEntranceTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/entrance/ConfigEntranceTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.gradleplugin.entrance
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.gradle.api.Project
import org.gradle.testfixtures.ProjectBuilder
import org.junit.jupiter.api.BeforeEach
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/generator/MavenRepoTypeTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/generator/MavenRepoTypeTest.kt
index b4d6fdf17..ce1b57648 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/generator/MavenRepoTypeTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/generator/MavenRepoTypeTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.gradleplugin.generator
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
+import kotlin.test.*
import org.junit.jupiter.api.Test
class MavenRepoTypeTest {
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionSimpleTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionSimpleTest.kt
index c0e80e83d..2603e6a32 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionSimpleTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionSimpleTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.gradleplugin.jar
import java.io.File
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.Copy
diff --git a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionTest.kt b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionTest.kt
index e839082a6..17e0d33c9 100644
--- a/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionTest.kt
+++ b/gradleplugin/gradleplugin-composeserver/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/jar/JarExtensionTest.kt
@@ -1,10 +1,8 @@
package io.github.truenine.composeserver.gradleplugin.jar
import java.io.File
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.Copy
diff --git a/gradleplugin/gradleplugin-dotenv/build.gradle.kts b/gradleplugin/gradleplugin-dotenv/build.gradle.kts
index 39897db3f..28fdd62fa 100644
--- a/gradleplugin/gradleplugin-dotenv/build.gradle.kts
+++ b/gradleplugin/gradleplugin-dotenv/build.gradle.kts
@@ -1,7 +1,7 @@
plugins {
`java-gradle-plugin`
id("buildlogic.kotlin-conventions")
- id("buildlogic.publish-conventions")
+ id("buildlogic.maven-publish-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/gradleplugin/gradleplugin-dotenv/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/Main.kt b/gradleplugin/gradleplugin-dotenv/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/Main.kt
index 52b0eeed3..ada441dcb 100644
--- a/gradleplugin/gradleplugin-dotenv/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/Main.kt
+++ b/gradleplugin/gradleplugin-dotenv/src/main/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/Main.kt
@@ -1,10 +1,10 @@
package io.github.truenine.composeserver.gradleplugin.dotenv
-import java.io.File
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.testing.Test
+import java.io.File
/**
* # Dotenv Gradle Plugin
diff --git a/gradleplugin/gradleplugin-dotenv/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvPluginFunctionalTest.kt b/gradleplugin/gradleplugin-dotenv/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvPluginFunctionalTest.kt
index bfb57a2df..7b4c2cf2b 100644
--- a/gradleplugin/gradleplugin-dotenv/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvPluginFunctionalTest.kt
+++ b/gradleplugin/gradleplugin-dotenv/src/test/kotlin/io/github/truenine/composeserver/gradleplugin/dotenv/DotenvPluginFunctionalTest.kt
@@ -1,12 +1,12 @@
package io.github.truenine.composeserver.gradleplugin.dotenv
-import java.io.File
-import java.nio.file.Path
-import kotlin.test.assertEquals
import org.gradle.testkit.runner.GradleRunner
import org.gradle.testkit.runner.TaskOutcome
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
+import java.io.File
+import java.nio.file.Path
+import kotlin.test.assertEquals
class DotenvPluginFunctionalTest {
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanel.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanel.kt
index fa29c6a06..3c84a328f 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanel.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanel.kt
@@ -8,34 +8,13 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.SimpleToolWindowPanel
import com.intellij.openapi.vfs.VirtualFile
-import com.intellij.ui.components.JBScrollPane
-import com.intellij.ui.components.JBTextArea
-import com.intellij.ui.components.JBTextField
+import com.intellij.ui.components.*
import com.intellij.util.ui.JBUI
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
-import io.github.truenine.composeserver.ide.ideamcp.services.CleanOptions
-import io.github.truenine.composeserver.ide.ideamcp.services.CleanService
-import io.github.truenine.composeserver.ide.ideamcp.services.ErrorService
-import io.github.truenine.composeserver.ide.ideamcp.services.FileManager
-import java.awt.BorderLayout
-import java.awt.Dimension
-import java.awt.GridBagConstraints
-import java.awt.GridBagLayout
-import java.awt.Insets
-import javax.swing.Box
-import javax.swing.BoxLayout
-import javax.swing.JButton
-import javax.swing.JCheckBox
-import javax.swing.JLabel
-import javax.swing.JOptionPane
-import javax.swing.JPanel
-import javax.swing.JSeparator
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
+import io.github.truenine.composeserver.ide.ideamcp.services.*
+import java.awt.*
+import javax.swing.*
+import kotlinx.coroutines.*
/** File operation panel that provides file selection and batch operations, integrating error view and code clean-up features. */
class FileOperationPanel(private val project: Project) : SimpleToolWindowPanel(true, true), Disposable {
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/LibCodeTestPanel.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/LibCodeTestPanel.kt
index 977cc5386..986b21bf9 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/LibCodeTestPanel.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/LibCodeTestPanel.kt
@@ -3,28 +3,14 @@ package io.github.truenine.composeserver.ide.ideamcp
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.SimpleToolWindowPanel
-import com.intellij.ui.components.JBLabel
-import com.intellij.ui.components.JBScrollPane
-import com.intellij.ui.components.JBTextField
+import com.intellij.ui.components.*
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeResult
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeService
-import java.awt.BorderLayout
-import java.awt.Font
-import java.awt.GridBagConstraints
-import java.awt.GridBagLayout
-import java.awt.Insets
-import javax.swing.JButton
-import javax.swing.JCheckBox
-import javax.swing.JLabel
-import javax.swing.JPanel
-import javax.swing.JTextArea
-import javax.swing.SwingUtilities
+import java.awt.*
+import javax.swing.*
import javax.swing.border.TitledBorder
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
+import kotlinx.coroutines.*
/**
* LibCodeService test panel.
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpDebugPanel.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpDebugPanel.kt
index 16c2ac800..c6d80ee3c 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpDebugPanel.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpDebugPanel.kt
@@ -5,9 +5,7 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel
import com.intellij.ui.components.JBScrollPane
import java.awt.BorderLayout
import java.awt.Font
-import javax.swing.JLabel
-import javax.swing.JPanel
-import javax.swing.JTextArea
+import javax.swing.*
/** Simplified MCP debug panel. */
class McpDebugPanel(private val project: Project) : SimpleToolWindowPanel(true, true) {
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpTerminalPanel.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpTerminalPanel.kt
index 92413c8fb..fcb0fa382 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpTerminalPanel.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/McpTerminalPanel.kt
@@ -5,27 +5,14 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.SimpleToolWindowPanel
-import com.intellij.ui.components.JBScrollPane
-import com.intellij.ui.components.JBTextArea
-import com.intellij.ui.components.JBTextField
+import com.intellij.ui.components.*
import com.intellij.util.ui.JBUI
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
-import java.awt.BorderLayout
-import java.awt.Dimension
-import java.awt.Font
+import java.awt.*
import java.awt.event.KeyAdapter
import java.awt.event.KeyEvent
-import javax.swing.Box
-import javax.swing.BoxLayout
-import javax.swing.JButton
-import javax.swing.JLabel
-import javax.swing.JPanel
-import javax.swing.JSplitPane
-import javax.swing.UIManager
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
+import javax.swing.*
+import kotlinx.coroutines.*
/** MCP terminal clean-up panel providing command input and output cleaning features. */
class McpTerminalPanel(private val project: Project) : SimpleToolWindowPanel(true, true), Disposable {
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/TerminalOutputInterceptor.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/TerminalOutputInterceptor.kt
index 51b479157..f0a729dd5 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/TerminalOutputInterceptor.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/TerminalOutputInterceptor.kt
@@ -1,18 +1,12 @@
package io.github.truenine.composeserver.ide.ideamcp
import com.intellij.execution.configurations.GeneralCommandLine
-import com.intellij.execution.process.OSProcessHandler
-import com.intellij.execution.process.ProcessEvent
-import com.intellij.execution.process.ProcessListener
+import com.intellij.execution.process.*
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.Service
import com.intellij.openapi.util.Key
import java.nio.charset.Charset
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.*
import org.slf4j.LoggerFactory
/**
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanCodeAction.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanCodeAction.kt
index ca9efecd2..b333ce2f1 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanCodeAction.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanCodeAction.kt
@@ -1,13 +1,8 @@
package io.github.truenine.composeserver.ide.ideamcp.actions
-import com.intellij.openapi.actionSystem.ActionUpdateThread
-import com.intellij.openapi.actionSystem.AnAction
-import com.intellij.openapi.actionSystem.AnActionEvent
-import com.intellij.openapi.actionSystem.CommonDataKeys
+import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.components.service
-import com.intellij.openapi.progress.ProgressIndicator
-import com.intellij.openapi.progress.ProgressManager
-import com.intellij.openapi.progress.Task
+import com.intellij.openapi.progress.*
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.vfs.VirtualFile
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanOptionsDialog.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanOptionsDialog.kt
index 63b815e15..29a5aef0c 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanOptionsDialog.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanOptionsDialog.kt
@@ -4,12 +4,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.openapi.ui.ValidationInfo
import io.github.truenine.composeserver.ide.ideamcp.services.CleanOptions
-import javax.swing.Box
-import javax.swing.BoxLayout
-import javax.swing.JCheckBox
-import javax.swing.JComponent
-import javax.swing.JLabel
-import javax.swing.JPanel
+import javax.swing.*
/**
* Code clean-up options dialog.
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanResultDialog.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanResultDialog.kt
index 3932eda73..af70dbf35 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanResultDialog.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/CleanResultDialog.kt
@@ -9,16 +9,7 @@ import io.github.truenine.composeserver.ide.ideamcp.services.CleanResult
import io.github.truenine.composeserver.ide.ideamcp.tools.CleanOperation
import java.awt.BorderLayout
import java.awt.Dimension
-import javax.swing.Action
-import javax.swing.BorderFactory
-import javax.swing.BoxLayout
-import javax.swing.DefaultListModel
-import javax.swing.JComponent
-import javax.swing.JLabel
-import javax.swing.JList
-import javax.swing.JPanel
-import javax.swing.ListSelectionModel
-import javax.swing.SwingConstants
+import javax.swing.*
import javax.swing.table.AbstractTableModel
/** Dialog that displays detailed results and statistics for code clean-up operations. */
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorReportDialog.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorReportDialog.kt
index 0dd348968..7c2ae34ca 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorReportDialog.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorReportDialog.kt
@@ -4,16 +4,9 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.ui.components.JBScrollPane
import com.intellij.ui.table.JBTable
-import io.github.truenine.composeserver.ide.ideamcp.tools.ErrorInfo
-import io.github.truenine.composeserver.ide.ideamcp.tools.ErrorSeverity
-import io.github.truenine.composeserver.ide.ideamcp.tools.FileErrorInfo
+import io.github.truenine.composeserver.ide.ideamcp.tools.*
import java.awt.Dimension
-import javax.swing.Action
-import javax.swing.Box
-import javax.swing.BoxLayout
-import javax.swing.JComponent
-import javax.swing.JLabel
-import javax.swing.JPanel
+import javax.swing.*
import javax.swing.table.AbstractTableModel
/**
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorViewOptionsDialog.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorViewOptionsDialog.kt
index d58c05840..210b30bfb 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorViewOptionsDialog.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ErrorViewOptionsDialog.kt
@@ -2,12 +2,7 @@ package io.github.truenine.composeserver.ide.ideamcp.actions
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
-import javax.swing.Box
-import javax.swing.BoxLayout
-import javax.swing.JCheckBox
-import javax.swing.JComponent
-import javax.swing.JLabel
-import javax.swing.JPanel
+import javax.swing.*
/**
* Error view options dialog.
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/LibCodeDialog.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/LibCodeDialog.kt
index a7d87ff99..d37116a59 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/LibCodeDialog.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/LibCodeDialog.kt
@@ -11,13 +11,7 @@ import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeResult
import io.github.truenine.composeserver.ide.ideamcp.tools.SourceType
import java.awt.BorderLayout
import java.awt.Dimension
-import javax.swing.Action
-import javax.swing.BorderFactory
-import javax.swing.BoxLayout
-import javax.swing.JComponent
-import javax.swing.JLabel
-import javax.swing.JPanel
-import javax.swing.SwingConstants
+import javax.swing.*
/**
* Dialog for displaying library code.
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewErrorAction.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewErrorAction.kt
index b6efde603..4f75f9184 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewErrorAction.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewErrorAction.kt
@@ -1,13 +1,8 @@
package io.github.truenine.composeserver.ide.ideamcp.actions
-import com.intellij.openapi.actionSystem.ActionUpdateThread
-import com.intellij.openapi.actionSystem.AnAction
-import com.intellij.openapi.actionSystem.AnActionEvent
-import com.intellij.openapi.actionSystem.CommonDataKeys
+import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.components.service
-import com.intellij.openapi.progress.ProgressIndicator
-import com.intellij.openapi.progress.ProgressManager
-import com.intellij.openapi.progress.Task
+import com.intellij.openapi.progress.*
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import io.github.truenine.composeserver.ide.ideamcp.services.ErrorService
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewLibCodeAction.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewLibCodeAction.kt
index 10542f2b7..7caf28bf2 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewLibCodeAction.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/actions/ViewLibCodeAction.kt
@@ -1,19 +1,12 @@
package io.github.truenine.composeserver.ide.ideamcp.actions
-import com.intellij.openapi.actionSystem.ActionUpdateThread
-import com.intellij.openapi.actionSystem.AnAction
-import com.intellij.openapi.actionSystem.AnActionEvent
-import com.intellij.openapi.actionSystem.CommonDataKeys
+import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.components.service
import com.intellij.openapi.editor.Editor
-import com.intellij.openapi.progress.ProgressIndicator
-import com.intellij.openapi.progress.ProgressManager
-import com.intellij.openapi.progress.Task
+import com.intellij.openapi.progress.*
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-import com.intellij.psi.PsiReference
+import com.intellij.psi.*
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeService
import kotlinx.coroutines.runBlocking
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanService.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanService.kt
index 08f34d4d4..f7495dce6 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanService.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanService.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.ide.ideamcp.services
import com.intellij.codeInsight.actions.OptimizeImportsProcessor
import com.intellij.codeInsight.actions.ReformatCodeProcessor
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
-import com.intellij.openapi.application.ApplicationManager
-import com.intellij.openapi.application.ReadAction
-import com.intellij.openapi.application.WriteAction
+import com.intellij.openapi.application.*
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
@@ -14,9 +12,7 @@ import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
import io.github.truenine.composeserver.ide.ideamcp.tools.CleanOperation
-import kotlin.coroutines.resume
-import kotlin.coroutines.resumeWithException
-import kotlin.coroutines.suspendCoroutine
+import kotlin.coroutines.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorService.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorService.kt
index 68dc3526d..70592804f 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorService.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorService.kt
@@ -9,13 +9,8 @@ import com.intellij.openapi.editor.Document
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
-import com.intellij.psi.PsiDocumentManager
-import com.intellij.psi.PsiErrorElement
-import com.intellij.psi.PsiFile
-import com.intellij.psi.PsiManager
-import io.github.truenine.composeserver.ide.ideamcp.tools.ErrorInfo
-import io.github.truenine.composeserver.ide.ideamcp.tools.ErrorSeverity
-import io.github.truenine.composeserver.ide.ideamcp.tools.FileErrorInfo
+import com.intellij.psi.*
+import io.github.truenine.composeserver.ide.ideamcp.tools.*
import org.slf4j.LoggerFactory
/**
diff --git a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeTool.kt b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeTool.kt
index 2bab29533..4ac725dfc 100644
--- a/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeTool.kt
+++ b/ide/ide-idea-mcp/src/main/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeTool.kt
@@ -4,9 +4,7 @@ import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import io.github.truenine.composeserver.ide.ideamcp.common.ErrorDetails
import io.github.truenine.composeserver.ide.ideamcp.common.Logger
-import io.github.truenine.composeserver.ide.ideamcp.services.CleanOptions
-import io.github.truenine.composeserver.ide.ideamcp.services.CleanService
-import io.github.truenine.composeserver.ide.ideamcp.services.FileManager
+import io.github.truenine.composeserver.ide.ideamcp.services.*
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanelTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanelTest.kt
index 4563cfa2f..d8488ad60 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanelTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/FileOperationPanelTest.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.ide.ideamcp
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
/** FileOperationPanel unit tests verifying basic behavior of the file operation panel. */
class FileOperationPanelTest {
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/examples/LibCodeServiceUsageExample.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/examples/LibCodeServiceUsageExample.kt
index 97bdcea98..35032f844 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/examples/LibCodeServiceUsageExample.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/examples/LibCodeServiceUsageExample.kt
@@ -5,9 +5,7 @@ import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeServiceImpl
import io.github.truenine.composeserver.ide.ideamcp.testutil.MockDataGenerator
import io.github.truenine.composeserver.ide.ideamcp.tools.SourceType
import io.mockk.mockk
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
/**
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/integration/FullIntegrationTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/integration/FullIntegrationTest.kt
index 5270e8ccc..deb88eaa6 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/integration/FullIntegrationTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/integration/FullIntegrationTest.kt
@@ -1,22 +1,10 @@
package io.github.truenine.composeserver.ide.ideamcp.integration
import com.intellij.testFramework.fixtures.BasePlatformTestCase
-import io.github.truenine.composeserver.ide.ideamcp.FileOperationPanel
-import io.github.truenine.composeserver.ide.ideamcp.McpDebugPanel
-import io.github.truenine.composeserver.ide.ideamcp.McpDebugToolWindowFactory
-import io.github.truenine.composeserver.ide.ideamcp.McpTerminalPanel
-import io.github.truenine.composeserver.ide.ideamcp.TerminalOutputInterceptor
-import io.github.truenine.composeserver.ide.ideamcp.actions.CleanCodeAction
-import io.github.truenine.composeserver.ide.ideamcp.actions.ViewErrorAction
-import io.github.truenine.composeserver.ide.ideamcp.actions.ViewLibCodeAction
-import io.github.truenine.composeserver.ide.ideamcp.services.CleanService
-import io.github.truenine.composeserver.ide.ideamcp.services.ErrorService
-import io.github.truenine.composeserver.ide.ideamcp.services.FileManager
-import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeService
-import io.github.truenine.composeserver.ide.ideamcp.tools.CleanCodeTool
-import io.github.truenine.composeserver.ide.ideamcp.tools.TerminalTool
-import io.github.truenine.composeserver.ide.ideamcp.tools.ViewErrorTool
-import io.github.truenine.composeserver.ide.ideamcp.tools.ViewLibCodeTool
+import io.github.truenine.composeserver.ide.ideamcp.*
+import io.github.truenine.composeserver.ide.ideamcp.actions.*
+import io.github.truenine.composeserver.ide.ideamcp.services.*
+import io.github.truenine.composeserver.ide.ideamcp.tools.*
/** Full integration tests for component collaboration and data flow. */
class FullIntegrationTest : BasePlatformTestCase() {
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanServiceTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanServiceTest.kt
index a326d11ed..407d5e056 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanServiceTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/CleanServiceTest.kt
@@ -3,13 +3,8 @@ package io.github.truenine.composeserver.ide.ideamcp.services
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import io.github.truenine.composeserver.ide.ideamcp.tools.CleanOperation
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import io.mockk.*
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
/** CleanService unit tests. */
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorCaptureFilterTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorCaptureFilterTest.kt
index 29e26acc6..0c58c04ee 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorCaptureFilterTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorCaptureFilterTest.kt
@@ -5,10 +5,7 @@ import com.intellij.psi.PsiFile
import com.intellij.testFramework.fixtures.BasePlatformTestCase
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.assertFalse
-import kotlin.test.assertNotSame
-import kotlin.test.assertSame
-import kotlin.test.assertTrue
+import kotlin.test.*
/**
* Tests for ErrorCaptureFilter.
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceFunctionalTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceFunctionalTest.kt
index f882bc188..ef3510c7c 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceFunctionalTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceFunctionalTest.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.ide.ideamcp.services
import com.intellij.testFramework.fixtures.BasePlatformTestCase
import io.github.truenine.composeserver.ide.ideamcp.tools.ErrorSeverity
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Functional tests verifying refactored error-capture behavior. */
class ErrorServiceFunctionalTest : BasePlatformTestCase() {
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceIntegrationTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceIntegrationTest.kt
index 04024d3fd..783be8bae 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceIntegrationTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/ErrorServiceIntegrationTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.ide.ideamcp.services
import com.intellij.testFramework.fixtures.BasePlatformTestCase
-import kotlin.test.assertNotNull
-import kotlin.test.assertNotSame
-import kotlin.test.assertSame
-import kotlin.test.assertTrue
+import kotlin.test.*
/**
* ErrorService integration tests.
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/FileManagerTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/FileManagerTest.kt
index 74d25f553..4d3861ffc 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/FileManagerTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/FileManagerTest.kt
@@ -4,10 +4,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
/** FileManager unit tests. */
class FileManagerTest {
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/LibCodeServiceConsoleTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/LibCodeServiceConsoleTest.kt
index fc845075c..1b99d53e3 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/LibCodeServiceConsoleTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/services/LibCodeServiceConsoleTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.ide.ideamcp.services
import com.intellij.openapi.project.Project
import io.mockk.mockk
-import kotlin.test.Test
-import kotlin.test.assertContains
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
/** LibCodeService console output tests. Verifies that the service returns complete content and prints detailed information to the console. */
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/simple/SimpleLibCodeTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/simple/SimpleLibCodeTest.kt
index 373459199..4e2b45423 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/simple/SimpleLibCodeTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/simple/SimpleLibCodeTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.ide.ideamcp.simple
import com.intellij.openapi.project.Project
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeServiceImpl
import io.mockk.mockk
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
/** Simple LibCodeService test verifying basic behavior. */
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/testutil/MockDataGenerator.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/testutil/MockDataGenerator.kt
index ed6ac6d8e..1ec9ba64b 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/testutil/MockDataGenerator.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/testutil/MockDataGenerator.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.ide.ideamcp.testutil
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeMetadata
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeResult
import io.github.truenine.composeserver.ide.ideamcp.tools.SourceType
-import java.io.ByteArrayOutputStream
-import java.io.File
-import java.io.FileOutputStream
+import java.io.*
import java.util.jar.JarEntry
import java.util.jar.JarOutputStream
import kotlin.random.Random
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeToolTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeToolTest.kt
index 8a6714728..d1e49e1bb 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeToolTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/CleanCodeToolTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.ide.ideamcp.tools
import io.github.truenine.composeserver.ide.ideamcp.common.ErrorDetails
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.serialization.json.Json
/** CleanCodeTool unit tests. */
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/ViewLibCodeToolTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/ViewLibCodeToolTest.kt
index 2eb9a8901..39aab7492 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/ViewLibCodeToolTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/tools/ViewLibCodeToolTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.ide.ideamcp.tools
import com.intellij.openapi.project.Project
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeResult
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeService
-import io.mockk.coEvery
-import io.mockk.every
-import io.mockk.mockk
+import io.mockk.*
import kotlin.test.Test
import kotlin.test.assertTrue
diff --git a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/verification/LibCodeServiceVerificationTest.kt b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/verification/LibCodeServiceVerificationTest.kt
index 9cf824c70..bc54fefc5 100644
--- a/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/verification/LibCodeServiceVerificationTest.kt
+++ b/ide/ide-idea-mcp/src/test/kotlin/io/github/truenine/composeserver/ide/ideamcp/verification/LibCodeServiceVerificationTest.kt
@@ -4,10 +4,7 @@ import com.intellij.openapi.project.Project
import io.github.truenine.composeserver.ide.ideamcp.services.LibCodeServiceImpl
import io.github.truenine.composeserver.ide.ideamcp.tools.SourceType
import io.mockk.mockk
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
/**
diff --git a/integrate-test/cacheable/build.gradle.kts b/integrate-test/cacheable/build.gradle.kts
index e875110cc..c21f071b3 100644
--- a/integrate-test/cacheable/build.gradle.kts
+++ b/integrate-test/cacheable/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-test-conventions")
+ id("buildlogic.kotlin-spring-boot-test-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/integrate-test/cacheable/src/test/kotlin/itest/integrate/cacheable/factory/RedisConnectionFactoryIntegrationTest.kt b/integrate-test/cacheable/src/test/kotlin/itest/integrate/cacheable/factory/RedisConnectionFactoryIntegrationTest.kt
index ec6bc2ea9..53f691f27 100644
--- a/integrate-test/cacheable/src/test/kotlin/itest/integrate/cacheable/factory/RedisConnectionFactoryIntegrationTest.kt
+++ b/integrate-test/cacheable/src/test/kotlin/itest/integrate/cacheable/factory/RedisConnectionFactoryIntegrationTest.kt
@@ -2,10 +2,7 @@ package itest.integrate.cacheable.factory
import io.github.truenine.composeserver.testtoolkit.testcontainers.ICacheRedisContainer
import jakarta.annotation.Resource
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertIs
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
diff --git a/integrate-test/depend/jackson/build.gradle.kts b/integrate-test/depend/jackson/build.gradle.kts
index ab752a4c8..1cec522f7 100644
--- a/integrate-test/depend/jackson/build.gradle.kts
+++ b/integrate-test/depend/jackson/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-test-conventions")
+ id("buildlogic.kotlin-spring-boot-test-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonCustomConfigurationTest.kt b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonCustomConfigurationTest.kt
index 17f1ac10c..f4b79c778 100644
--- a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonCustomConfigurationTest.kt
+++ b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonCustomConfigurationTest.kt
@@ -1,13 +1,9 @@
package itest.integrate.depend.jackson
import com.fasterxml.jackson.annotation.JsonInclude
-import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
-import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonProperties
-import io.github.truenine.composeserver.depend.jackson.autoconfig.TimestampUnit
+import io.github.truenine.composeserver.depend.jackson.autoconfig.*
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Qualifier
diff --git a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonTimestampConfigurationTest.kt b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonTimestampConfigurationTest.kt
index 2e3199972..c46358b5b 100644
--- a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonTimestampConfigurationTest.kt
+++ b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/JacksonTimestampConfigurationTest.kt
@@ -1,15 +1,10 @@
package itest.integrate.depend.jackson
-import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
-import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonProperties
-import io.github.truenine.composeserver.depend.jackson.autoconfig.TimestampUnit
+import io.github.truenine.composeserver.depend.jackson.autoconfig.*
import io.github.truenine.composeserver.depend.jackson.holders.ObjectMapperHolder
import jakarta.annotation.Resource
import java.time.Instant
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Qualifier
diff --git a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/ManualWebConfigurationTest.kt b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/ManualWebConfigurationTest.kt
index 5ea601e3f..c9c12a363 100644
--- a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/ManualWebConfigurationTest.kt
+++ b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/ManualWebConfigurationTest.kt
@@ -2,20 +2,15 @@ package itest.integrate.depend.jackson
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import jakarta.annotation.Resource
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.ZoneId
+import java.time.*
import java.util.*
import kotlin.test.assertNotNull
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import
-import org.springframework.http.HttpInputMessage
-import org.springframework.http.HttpOutputMessage
+import org.springframework.http.*
import org.springframework.http.MediaType
import org.springframework.http.converter.AbstractHttpMessageConverter
import org.springframework.test.web.servlet.MockMvc
@@ -24,10 +19,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.test.web.servlet.setup.MockMvcBuilders
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
import tools.jackson.databind.ObjectMapper
/**
diff --git a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/NonInternalObjectMapperIntegrationTest.kt b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/NonInternalObjectMapperIntegrationTest.kt
index c40f47c7a..0129b69ae 100644
--- a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/NonInternalObjectMapperIntegrationTest.kt
+++ b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/NonInternalObjectMapperIntegrationTest.kt
@@ -2,9 +2,7 @@ package itest.integrate.depend.jackson
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import jakarta.annotation.Resource
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.springframework.boot.test.context.SpringBootTest
import tools.jackson.databind.ObjectMapper
diff --git a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/TimezoneIndependenceTest.kt b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/TimezoneIndependenceTest.kt
index 27e189249..927523c5e 100644
--- a/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/TimezoneIndependenceTest.kt
+++ b/integrate-test/depend/jackson/src/test/kotlin/itest/integrate/depend/jackson/TimezoneIndependenceTest.kt
@@ -2,12 +2,7 @@ package itest.integrate.depend.jackson
import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoConfiguration
import jakarta.annotation.Resource
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.OffsetDateTime
-import java.time.ZoneId
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
+import java.time.*
import java.util.*
import kotlin.test.assertEquals
import kotlin.test.assertTrue
diff --git a/integrate-test/oss/minio/build.gradle.kts b/integrate-test/oss/minio/build.gradle.kts
index 9c33467c2..e0a30b998 100644
--- a/integrate-test/oss/minio/build.gradle.kts
+++ b/integrate-test/oss/minio/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-test-conventions")
+ id("buildlogic.kotlin-spring-boot-test-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/integrate-test/oss/minio/src/test/kotlin/itest/integrate/oss/minio/AutoConfigurationPropertiesTest.kt b/integrate-test/oss/minio/src/test/kotlin/itest/integrate/oss/minio/AutoConfigurationPropertiesTest.kt
index 0d2dde70e..31e418a14 100644
--- a/integrate-test/oss/minio/src/test/kotlin/itest/integrate/oss/minio/AutoConfigurationPropertiesTest.kt
+++ b/integrate-test/oss/minio/src/test/kotlin/itest/integrate/oss/minio/AutoConfigurationPropertiesTest.kt
@@ -1,13 +1,7 @@
package itest.integrate.oss.minio
import io.github.truenine.composeserver.enums.HttpMethod
-import io.github.truenine.composeserver.oss.CorsRule
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.IObjectStorageService
-import io.github.truenine.composeserver.oss.LifecycleExpiration
-import io.github.truenine.composeserver.oss.LifecycleRule
-import io.github.truenine.composeserver.oss.LifecycleRuleStatus
-import io.github.truenine.composeserver.oss.ListObjectVersionsRequest
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.oss.Tag
import io.github.truenine.composeserver.oss.minio.autoconfig.MinioAutoConfiguration
import io.github.truenine.composeserver.oss.minio.properties.MinioProperties
@@ -19,10 +13,7 @@ import java.io.ByteArrayInputStream
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import kotlinx.coroutines.runBlocking
-import org.junit.jupiter.api.Disabled
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
-import org.junit.jupiter.api.assertNotNull
+import org.junit.jupiter.api.*
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Import
diff --git a/integrate-test/oss/volcengine-tos/build.gradle.kts b/integrate-test/oss/volcengine-tos/build.gradle.kts
index d2ed3619e..1acad5f63 100644
--- a/integrate-test/oss/volcengine-tos/build.gradle.kts
+++ b/integrate-test/oss/volcengine-tos/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-test-conventions")
+ id("buildlogic.kotlin-spring-boot-test-conventions")
id("buildlogic.spotless-conventions")
id("io.github.truenine.composeserver.dotenv")
}
diff --git a/integrate-test/oss/volcengine-tos/src/test/kotlin/itest/integrate/oss/volcenginetos/VolcengineTosObjectStorageServiceIntegrationTest.kt b/integrate-test/oss/volcengine-tos/src/test/kotlin/itest/integrate/oss/volcenginetos/VolcengineTosObjectStorageServiceIntegrationTest.kt
index 422deecd2..403927fae 100644
--- a/integrate-test/oss/volcengine-tos/src/test/kotlin/itest/integrate/oss/volcenginetos/VolcengineTosObjectStorageServiceIntegrationTest.kt
+++ b/integrate-test/oss/volcengine-tos/src/test/kotlin/itest/integrate/oss/volcenginetos/VolcengineTosObjectStorageServiceIntegrationTest.kt
@@ -4,19 +4,7 @@ import com.volcengine.tos.TOSV2
import com.volcengine.tos.TOSV2ClientBuilder
import io.github.truenine.composeserver.enums.HttpMethod
import io.github.truenine.composeserver.logger
-import io.github.truenine.composeserver.oss.CompleteMultipartUploadRequest
-import io.github.truenine.composeserver.oss.CopyObjectRequest
-import io.github.truenine.composeserver.oss.CorsRule
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.InitiateMultipartUploadRequest
-import io.github.truenine.composeserver.oss.LifecycleExpiration
-import io.github.truenine.composeserver.oss.LifecycleRule
-import io.github.truenine.composeserver.oss.LifecycleRuleStatus
-import io.github.truenine.composeserver.oss.ListObjectVersionsRequest
-import io.github.truenine.composeserver.oss.ListObjectsRequest
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.Tag
-import io.github.truenine.composeserver.oss.UploadPartRequest
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.oss.volcengine.VolcengineTosObjectStorageService
import java.io.ByteArrayInputStream
import java.time.Duration
diff --git a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginMain.kt b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginMain.kt
index afc2d2df0..0b972b068 100644
--- a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginMain.kt
+++ b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginMain.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.ksp.plugin
-import com.google.devtools.ksp.processing.SymbolProcessor
-import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
-import com.google.devtools.ksp.processing.SymbolProcessorProvider
+import com.google.devtools.ksp.processing.*
class KspPluginMain : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
diff --git a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginProcessor.kt b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginProcessor.kt
index 71c820dd4..8fc807dc2 100644
--- a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginProcessor.kt
+++ b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/KspPluginProcessor.kt
@@ -1,16 +1,8 @@
package io.github.truenine.composeserver.ksp.plugin
-import com.google.devtools.ksp.KspExperimental
-import com.google.devtools.ksp.getAnnotationsByType
-import com.google.devtools.ksp.getDeclaredProperties
-import com.google.devtools.ksp.isAnnotationPresent
-import com.google.devtools.ksp.processing.Resolver
-import com.google.devtools.ksp.processing.SymbolProcessor
-import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
-import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.validate
+import com.google.devtools.ksp.*
+import com.google.devtools.ksp.processing.*
+import com.google.devtools.ksp.symbol.*
import com.squareup.kotlinpoet.ksp.toAnnotationSpec
import io.github.truenine.composeserver.ksp.meta.annotations.MetaDef
import io.github.truenine.composeserver.ksp.meta.annotations.MetaSkipGeneration
diff --git a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/visitor/JpaNameClassVisitor.kt b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/visitor/JpaNameClassVisitor.kt
index ab41f933a..402bf3e7a 100644
--- a/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/visitor/JpaNameClassVisitor.kt
+++ b/ksp/ksp-plugin/src/main/kotlin/io/github/truenine/composeserver/ksp/plugin/visitor/JpaNameClassVisitor.kt
@@ -1,56 +1,18 @@
package io.github.truenine.composeserver.ksp.plugin.visitor
-import com.google.devtools.ksp.KspExperimental
-import com.google.devtools.ksp.getAllSuperTypes
-import com.google.devtools.ksp.getAnnotationsByType
-import com.google.devtools.ksp.isAnnotationPresent
-import com.google.devtools.ksp.isOpen
-import com.google.devtools.ksp.isPublic
+import com.google.devtools.ksp.*
import com.google.devtools.ksp.processing.KSPLogger
-import com.google.devtools.ksp.symbol.AnnotationUseSiteTarget
-import com.google.devtools.ksp.symbol.ClassKind
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSNode
-import com.google.devtools.ksp.symbol.KSPropertyDeclaration
+import com.google.devtools.ksp.symbol.*
import com.google.devtools.ksp.visitor.KSTopDownVisitor
-import com.squareup.kotlinpoet.AnnotationSpec
-import com.squareup.kotlinpoet.ClassName
-import com.squareup.kotlinpoet.CodeBlock
-import com.squareup.kotlinpoet.FunSpec
-import com.squareup.kotlinpoet.KModifier
-import com.squareup.kotlinpoet.ParameterSpec
-import com.squareup.kotlinpoet.PropertySpec
-import com.squareup.kotlinpoet.TypeSpec
-import com.squareup.kotlinpoet.asTypeName
-import com.squareup.kotlinpoet.ksp.toAnnotationSpec
-import com.squareup.kotlinpoet.ksp.toTypeName
-import com.squareup.kotlinpoet.ksp.writeTo
-import io.github.truenine.composeserver.ksp.addConstModifier
-import io.github.truenine.composeserver.ksp.addFinalModifier
-import io.github.truenine.composeserver.ksp.addOpeneModifier
-import io.github.truenine.composeserver.ksp.addOverrideModifier
+import com.squareup.kotlinpoet.*
+import com.squareup.kotlinpoet.ksp.*
+import io.github.truenine.composeserver.ksp.*
import io.github.truenine.composeserver.ksp.dsl.fileDsl
-import io.github.truenine.composeserver.ksp.getKsAnnotationsByAnnotationClassQualifiedName
-import io.github.truenine.composeserver.ksp.isAnnotationByKClass
-import io.github.truenine.composeserver.ksp.isBasicType
import io.github.truenine.composeserver.ksp.kotlinpoet.Libs
-import io.github.truenine.composeserver.ksp.meta.annotations.MetaAutoManagement
-import io.github.truenine.composeserver.ksp.meta.annotations.MetaDef
-import io.github.truenine.composeserver.ksp.meta.annotations.MetaName
-import io.github.truenine.composeserver.ksp.meta.annotations.MetaSkipGeneration
+import io.github.truenine.composeserver.ksp.meta.annotations.*
import io.github.truenine.composeserver.ksp.meta.annotations.orm.MetaFormula
import io.github.truenine.composeserver.ksp.meta.getFirstName
import io.github.truenine.composeserver.ksp.models.DeclarationContext
-import io.github.truenine.composeserver.ksp.packageNameAsString
-import io.github.truenine.composeserver.ksp.qualifiedNameAsString
-import io.github.truenine.composeserver.ksp.realDeclaration
-import io.github.truenine.composeserver.ksp.simpleName
-import io.github.truenine.composeserver.ksp.simpleNameAsString
-import io.github.truenine.composeserver.ksp.simpleNameGetShortNameStr
-import io.github.truenine.composeserver.ksp.useDelegate
-import io.github.truenine.composeserver.ksp.useField
-import io.github.truenine.composeserver.ksp.useFile
-import io.github.truenine.composeserver.ksp.useGet
import kotlin.properties.Delegates
private sealed class PropertyProcessingResult {
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/FunSpecFns.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/FunSpecFns.kt
index f047eae9e..121d56f09 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/FunSpecFns.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/FunSpecFns.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.ksp
import com.google.devtools.ksp.isOpen
import com.google.devtools.ksp.isPublic
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
-import com.squareup.kotlinpoet.FunSpec
-import com.squareup.kotlinpoet.KModifier
-import com.squareup.kotlinpoet.ParameterSpec
+import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.ksp.toTypeName
fun KSFunctionDeclaration.toFunSpec(): FunSpec {
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSAnnotatedFns.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSAnnotatedFns.kt
index d18034f1e..4f3df9863 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSAnnotatedFns.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSAnnotatedFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.ksp
-import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSAnnotation
-import com.google.devtools.ksp.symbol.KSDeclaration
+import com.google.devtools.ksp.symbol.*
import kotlin.reflect.KClass
fun KSAnnotated.getKsAnnotationsByAnnotationClassQualifiedName(qualifiedName: String): Sequence {
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSDeclarationFns.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSDeclarationFns.kt
index 263654ca6..f39c0fa15 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSDeclarationFns.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSDeclarationFns.kt
@@ -1,13 +1,7 @@
package io.github.truenine.composeserver.ksp
import com.google.devtools.ksp.findActualType
-import com.google.devtools.ksp.symbol.FileLocation
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.symbol.KSName
-import com.google.devtools.ksp.symbol.KSPropertyDeclaration
-import com.google.devtools.ksp.symbol.KSTypeAlias
-import com.google.devtools.ksp.symbol.KSTypeParameter
+import com.google.devtools.ksp.symbol.*
import kotlin.reflect.KClass
/**
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSTypeReferenceFns.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSTypeReferenceFns.kt
index 749a2126e..0c0ae5b77 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSTypeReferenceFns.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/KSTypeReferenceFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.ksp
-import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.symbol.KSType
-import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentMap
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/Utils.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/Utils.kt
index 10e535b58..9161167bb 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/Utils.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/Utils.kt
@@ -1,15 +1,8 @@
package io.github.truenine.composeserver.ksp
-import com.google.devtools.ksp.ExceptionMessage
-import com.google.devtools.ksp.KSTypeNotPresentException
-import com.google.devtools.ksp.KSTypesNotPresentException
-import com.google.devtools.ksp.KspExperimental
-import com.google.devtools.ksp.symbol.KSAnnotation
-import com.google.devtools.ksp.symbol.KSType
-import com.google.devtools.ksp.symbol.KSValueArgument
-import java.lang.reflect.InvocationHandler
-import java.lang.reflect.Method
-import java.lang.reflect.Proxy
+import com.google.devtools.ksp.*
+import com.google.devtools.ksp.symbol.*
+import java.lang.reflect.*
import java.util.concurrent.ConcurrentHashMap
import kotlin.reflect.KClass
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KFileSpecScope.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KFileSpecScope.kt
index 5044daf1b..ebc59c3ec 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KFileSpecScope.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KFileSpecScope.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.ksp.dsl
-import com.squareup.kotlinpoet.ClassName
-import com.squareup.kotlinpoet.FileSpec
-import com.squareup.kotlinpoet.MemberName
+import com.squareup.kotlinpoet.*
import kotlin.reflect.KClass
class KFileSpecScope @JvmOverloads constructor(packageName: String = "", fileName: String = "", className: ClassName? = null, memberName: MemberName? = null) :
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KObjectSpecScope.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KObjectSpecScope.kt
index 34808ed61..96c35c91d 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KObjectSpecScope.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/dsl/KObjectSpecScope.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.ksp.dsl
-import com.squareup.kotlinpoet.ClassName
-import com.squareup.kotlinpoet.FileSpec
-import com.squareup.kotlinpoet.TypeSpec
+import com.squareup.kotlinpoet.*
class KObjectSpecScope @JvmOverloads constructor(name: String = "", className: ClassName? = null, override val fileBuilder: FileSpec.Builder) :
StandardBuilderAdaptor {
diff --git a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/models/DeclarationContext.kt b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/models/DeclarationContext.kt
index 5801ba70f..bb31147d7 100644
--- a/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/models/DeclarationContext.kt
+++ b/ksp/ksp-shared/src/main/kotlin/io/github/truenine/composeserver/ksp/models/DeclarationContext.kt
@@ -1,14 +1,7 @@
package io.github.truenine.composeserver.ksp.models
-import com.google.devtools.ksp.processing.CodeGenerator
-import com.google.devtools.ksp.processing.Dependencies
-import com.google.devtools.ksp.processing.KSPLogger
-import com.google.devtools.ksp.processing.Resolver
-import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
-import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.symbol.KSFile
-import com.google.devtools.ksp.symbol.KSVisitor
+import com.google.devtools.ksp.processing.*
+import com.google.devtools.ksp.symbol.*
import java.util.concurrent.CopyOnWriteArraySet
data class DeclarationContext(
diff --git a/oss/oss-aliyun-oss/build.gradle.kts b/oss/oss-aliyun-oss/build.gradle.kts
index c7fb7316c..afa921d4a 100644
--- a/oss/oss-aliyun-oss/build.gradle.kts
+++ b/oss/oss-aliyun-oss/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/oss/oss-huawei-obs/build.gradle.kts b/oss/oss-huawei-obs/build.gradle.kts
index e2c0e4c8d..e20683f8f 100644
--- a/oss/oss-huawei-obs/build.gradle.kts
+++ b/oss/oss-huawei-obs/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/oss/oss-minio/build.gradle.kts b/oss/oss-minio/build.gradle.kts
index b98d14db8..46a1ace59 100644
--- a/oss/oss-minio/build.gradle.kts
+++ b/oss/oss-minio/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/oss/oss-minio/src/main/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageService.kt b/oss/oss-minio/src/main/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageService.kt
index 475c17e08..46953e3b1 100644
--- a/oss/oss-minio/src/main/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageService.kt
+++ b/oss/oss-minio/src/main/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageService.kt
@@ -2,56 +2,13 @@ package io.github.truenine.composeserver.oss.minio
import com.google.common.collect.HashMultimap
import com.google.common.collect.Multimap
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.enums.HttpMethod
-import io.github.truenine.composeserver.mapFailure
-import io.github.truenine.composeserver.onFailureDo
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.oss.AbortIncompleteMultipartUpload
-import io.github.truenine.composeserver.oss.AuthenticationException
-import io.github.truenine.composeserver.oss.AuthorizationException
-import io.github.truenine.composeserver.oss.BucketAccessLevel
-import io.github.truenine.composeserver.oss.BucketAlreadyExistsException
-import io.github.truenine.composeserver.oss.BucketInfo
-import io.github.truenine.composeserver.oss.BucketNotEmptyException
-import io.github.truenine.composeserver.oss.BucketNotFoundException
-import io.github.truenine.composeserver.oss.CompleteMultipartUploadRequest
-import io.github.truenine.composeserver.oss.ConfigurationException
-import io.github.truenine.composeserver.oss.ContentRange
-import io.github.truenine.composeserver.oss.CopyObjectRequest
-import io.github.truenine.composeserver.oss.CorsRule
-import io.github.truenine.composeserver.oss.CreateBucketRequest
import io.github.truenine.composeserver.oss.DeleteResult
-import io.github.truenine.composeserver.oss.IObjectStorageService
-import io.github.truenine.composeserver.oss.InitiateMultipartUploadRequest
-import io.github.truenine.composeserver.oss.InvalidRequestException
-import io.github.truenine.composeserver.oss.LifecycleExpiration
-import io.github.truenine.composeserver.oss.LifecycleNoncurrentVersionExpiration
-import io.github.truenine.composeserver.oss.LifecycleNoncurrentVersionTransition
import io.github.truenine.composeserver.oss.LifecycleRule
-import io.github.truenine.composeserver.oss.LifecycleRuleStatus
-import io.github.truenine.composeserver.oss.LifecycleTransition
-import io.github.truenine.composeserver.oss.ListObjectVersionsRequest
-import io.github.truenine.composeserver.oss.ListObjectsRequest
-import io.github.truenine.composeserver.oss.MultipartUpload
-import io.github.truenine.composeserver.oss.NetworkException
-import io.github.truenine.composeserver.oss.ObjectContent
-import io.github.truenine.composeserver.oss.ObjectInfo
-import io.github.truenine.composeserver.oss.ObjectListing
-import io.github.truenine.composeserver.oss.ObjectNotFoundException
-import io.github.truenine.composeserver.oss.ObjectStorageException
-import io.github.truenine.composeserver.oss.ObjectVersionInfo
-import io.github.truenine.composeserver.oss.ObjectVersionListing
-import io.github.truenine.composeserver.oss.PartInfo
-import io.github.truenine.composeserver.oss.PutObjectRequest
-import io.github.truenine.composeserver.oss.ServiceUnavailableException
-import io.github.truenine.composeserver.oss.ShareLinkInfo
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.StorageClass
import io.github.truenine.composeserver.oss.Tag
-import io.github.truenine.composeserver.oss.UploadPartRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkResponse
-import io.github.truenine.composeserver.safeCallAsync
-import io.github.truenine.composeserver.slf4j
import io.minio.BucketExistsArgs
import io.minio.CopyObjectArgs
import io.minio.CopySource
@@ -83,33 +40,17 @@ import io.minio.SetBucketTagsArgs
import io.minio.SetBucketVersioningArgs
import io.minio.SetObjectTagsArgs
import io.minio.StatObjectArgs
-import io.minio.errors.BucketPolicyTooLargeException
-import io.minio.errors.ErrorResponseException
-import io.minio.errors.InsufficientDataException
-import io.minio.errors.InternalException
-import io.minio.errors.InvalidResponseException
-import io.minio.errors.ServerException
-import io.minio.errors.XmlParserException
+import io.minio.errors.*
import io.minio.http.Method
+import io.minio.messages.*
import io.minio.messages.AbortIncompleteMultipartUpload as MinioAbortIncompleteMultipartUpload
-import io.minio.messages.AndOperator
-import io.minio.messages.CORSConfiguration
-import io.minio.messages.DeleteError
-import io.minio.messages.DeleteObject
import io.minio.messages.Expiration as MinioExpiration
-import io.minio.messages.Item
-import io.minio.messages.LifecycleConfiguration
import io.minio.messages.LifecycleRule as MinioLifecycleRule
import io.minio.messages.NoncurrentVersionExpiration as MinioNoncurrentVersionExpiration
import io.minio.messages.NoncurrentVersionTransition as MinioNoncurrentVersionTransition
-import io.minio.messages.Part
-import io.minio.messages.ResponseDate
-import io.minio.messages.RuleFilter
import io.minio.messages.Status as MinioRuleStatus
import io.minio.messages.Tag as MinioTag
-import io.minio.messages.Tags
import io.minio.messages.Transition as MinioTransition
-import io.minio.messages.VersioningConfiguration
import java.io.IOException
import java.io.InputStream
import java.lang.reflect.InvocationTargetException
@@ -117,9 +58,26 @@ import java.security.InvalidKeyException
import java.security.NoSuchAlgorithmException
import java.time.Duration
import java.time.Instant
-import java.util.concurrent.CompletionException
-import java.util.concurrent.ExecutionException
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.*
+import kotlin.Any
+import kotlin.Boolean
+import kotlin.Exception
+import kotlin.IllegalArgumentException
+import kotlin.Int
+import kotlin.Long
+import kotlin.Result
+import kotlin.String
+import kotlin.Suppress
+import kotlin.Unit
+import kotlin.apply
+import kotlin.fold
+import kotlin.getOrDefault
+import kotlin.getOrThrow
+import kotlin.getValue
+import kotlin.lazy
+import kotlin.let
+import kotlin.runCatching
+import kotlin.to
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
diff --git a/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageServiceTest.kt b/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageServiceTest.kt
index 855a4be01..37aaffeec 100644
--- a/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageServiceTest.kt
+++ b/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/MinioObjectStorageServiceTest.kt
@@ -1,19 +1,12 @@
package io.github.truenine.composeserver.oss.minio
import io.github.truenine.composeserver.enums.HttpMethod
-import io.github.truenine.composeserver.oss.BucketAccessLevel
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.IObjectStorageService
-import io.github.truenine.composeserver.oss.PutObjectRequest
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkRequest
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.testtoolkit.log
import io.github.truenine.composeserver.testtoolkit.testcontainers.IOssMinioContainer
import io.minio.MinioClient
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
diff --git a/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/ShareLinkIntegrationTest.kt b/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/ShareLinkIntegrationTest.kt
index 4c4f734e9..2915b3a98 100644
--- a/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/ShareLinkIntegrationTest.kt
+++ b/oss/oss-minio/src/test/kotlin/io/github/truenine/composeserver/oss/minio/ShareLinkIntegrationTest.kt
@@ -1,21 +1,14 @@
package io.github.truenine.composeserver.oss.minio
import io.github.truenine.composeserver.enums.HttpMethod
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkResponse
-import io.github.truenine.composeserver.oss.generateSimpleShareLink
-import io.github.truenine.composeserver.oss.putObject
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.testtoolkit.log
import io.minio.MinioClient
import java.time.Duration
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import kotlinx.coroutines.test.runTest
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.testcontainers.containers.MinIOContainer
import org.testcontainers.junit.jupiter.Container
import org.testcontainers.junit.jupiter.Testcontainers
diff --git a/oss/oss-shared/build.gradle.kts b/oss/oss-shared/build.gradle.kts
index 4c0b941e2..cfcea90dc 100644
--- a/oss/oss-shared/build.gradle.kts
+++ b/oss/oss-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/IObjectStorageServiceTest.kt b/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/IObjectStorageServiceTest.kt
index 62a643568..5b13ae817 100644
--- a/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/IObjectStorageServiceTest.kt
+++ b/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/IObjectStorageServiceTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.oss
import io.github.truenine.composeserver.enums.HttpMethod
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/properties/OssPropertiesTest.kt b/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/properties/OssPropertiesTest.kt
index bd312f7ba..61a66c353 100644
--- a/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/properties/OssPropertiesTest.kt
+++ b/oss/oss-shared/src/test/kotlin/io/github/truenine/composeserver/oss/properties/OssPropertiesTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.oss.properties
import io.github.truenine.composeserver.consts.SpringBootConfigurationPropertiesPrefixes
import java.time.Duration
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.boot.context.properties.bind.Binder
diff --git a/oss/oss-volcengine-tos/README.md b/oss/oss-volcengine-tos/README.md
index e035627f5..5730245b9 100644
--- a/oss/oss-volcengine-tos/README.md
+++ b/oss/oss-volcengine-tos/README.md
@@ -1,5 +1,9 @@
-# Volcengine TOS Integration
+# Volcengine TOS Integration
-[Official Documentation](https://www.volcengine.com/docs/6349/74836)
-[Java SDK Documentation](https://www.volcengine.com/docs/6349/79895)
-[Multipart Upload](https://www.volcengine.com/docs/6349/79922)
+Volcengine object storage service integration module
+
+## Official Docs
+
+- [TOS Docs](https://www.volcengine.com/docs/6349/74836)
+- [Java SDK](https://www.volcengine.com/docs/6349/79895)
+- [Multipart Upload](https://www.volcengine.com/docs/6349/79922)
diff --git a/oss/oss-volcengine-tos/build.gradle.kts b/oss/oss-volcengine-tos/build.gradle.kts
index 5c62f1e28..9f1ad43a7 100644
--- a/oss/oss-volcengine-tos/build.gradle.kts
+++ b/oss/oss-volcengine-tos/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
id("io.github.truenine.composeserver.dotenv")
}
diff --git a/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageService.kt b/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageService.kt
index 0615ee07c..c4a6c8042 100644
--- a/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageService.kt
+++ b/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageService.kt
@@ -1,89 +1,19 @@
package io.github.truenine.composeserver.oss.volcengine
import com.volcengine.tos.TOSV2
-import com.volcengine.tos.comm.common.ACLType
-import com.volcengine.tos.comm.common.StatusType
-import com.volcengine.tos.comm.common.VersioningStatusType
+import com.volcengine.tos.comm.common.*
+import com.volcengine.tos.model.bucket.*
import com.volcengine.tos.model.bucket.CORSRule as TosCorsRule
-import com.volcengine.tos.model.bucket.CreateBucketV2Input
-import com.volcengine.tos.model.bucket.DeleteBucketCORSInput
-import com.volcengine.tos.model.bucket.DeleteBucketInput
-import com.volcengine.tos.model.bucket.DeleteBucketLifecycleInput
-import com.volcengine.tos.model.bucket.DeleteBucketTaggingInput
import com.volcengine.tos.model.bucket.Expiration as TosExpiration
-import com.volcengine.tos.model.bucket.GetBucketCORSInput
-import com.volcengine.tos.model.bucket.GetBucketLifecycleInput
-import com.volcengine.tos.model.bucket.GetBucketPolicyInput
-import com.volcengine.tos.model.bucket.GetBucketTaggingInput
-import com.volcengine.tos.model.bucket.HeadBucketV2Input
import com.volcengine.tos.model.bucket.LifecycleRule as TosLifecycleRule
-import com.volcengine.tos.model.bucket.ListBucketsV2Input
-import com.volcengine.tos.model.bucket.PutBucketACLInput
-import com.volcengine.tos.model.bucket.PutBucketCORSInput
-import com.volcengine.tos.model.bucket.PutBucketLifecycleInput
-import com.volcengine.tos.model.bucket.PutBucketPolicyInput
-import com.volcengine.tos.model.bucket.PutBucketTaggingInput
-import com.volcengine.tos.model.bucket.PutBucketVersioningInput
import com.volcengine.tos.model.bucket.Tag as TosTag
-import com.volcengine.tos.model.`object`.AbortMultipartUploadInput
-import com.volcengine.tos.model.`object`.CompleteMultipartUploadV2Input
-import com.volcengine.tos.model.`object`.CopyObjectV2Input
-import com.volcengine.tos.model.`object`.CreateMultipartUploadInput
-import com.volcengine.tos.model.`object`.DeleteObjectInput
-import com.volcengine.tos.model.`object`.GetObjectV2Input
-import com.volcengine.tos.model.`object`.HeadObjectV2Input
-import com.volcengine.tos.model.`object`.ListObjectVersionsV2Input
-import com.volcengine.tos.model.`object`.ListObjectsType2Input
-import com.volcengine.tos.model.`object`.ListObjectsV2Input
-import com.volcengine.tos.model.`object`.ListPartsInput
-import com.volcengine.tos.model.`object`.PreSignedURLInput
-import com.volcengine.tos.model.`object`.PutObjectBasicInput
-import com.volcengine.tos.model.`object`.PutObjectInput
-import com.volcengine.tos.model.`object`.TagSet
-import com.volcengine.tos.model.`object`.UploadPartV2Input
-import com.volcengine.tos.model.`object`.UploadedPartV2
+import com.volcengine.tos.model.`object`.*
import io.github.truenine.composeserver.enums.HttpMethod
import io.github.truenine.composeserver.logger
-import io.github.truenine.composeserver.oss.AuthenticationException
-import io.github.truenine.composeserver.oss.AuthorizationException
-import io.github.truenine.composeserver.oss.BucketAccessLevel
-import io.github.truenine.composeserver.oss.BucketAlreadyExistsException
+import io.github.truenine.composeserver.oss.*
import io.github.truenine.composeserver.oss.BucketInfo as OssBucketInfo
-import io.github.truenine.composeserver.oss.BucketNotEmptyException
-import io.github.truenine.composeserver.oss.BucketNotFoundException
-import io.github.truenine.composeserver.oss.CompleteMultipartUploadRequest
-import io.github.truenine.composeserver.oss.ConfigurationException
-import io.github.truenine.composeserver.oss.CopyObjectRequest
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.DeleteResult
-import io.github.truenine.composeserver.oss.IObjectStorageService
-import io.github.truenine.composeserver.oss.InitiateMultipartUploadRequest
-import io.github.truenine.composeserver.oss.InvalidRequestException
-import io.github.truenine.composeserver.oss.LifecycleExpiration
import io.github.truenine.composeserver.oss.LifecycleRule
-import io.github.truenine.composeserver.oss.LifecycleRuleStatus
-import io.github.truenine.composeserver.oss.ListObjectVersionsRequest
-import io.github.truenine.composeserver.oss.ListObjectsRequest
-import io.github.truenine.composeserver.oss.MultipartUpload
-import io.github.truenine.composeserver.oss.NetworkException
-import io.github.truenine.composeserver.oss.ObjectContent
-import io.github.truenine.composeserver.oss.ObjectInfo
-import io.github.truenine.composeserver.oss.ObjectListing
-import io.github.truenine.composeserver.oss.ObjectNotFoundException
-import io.github.truenine.composeserver.oss.ObjectStorageException
-import io.github.truenine.composeserver.oss.ObjectVersionInfo
-import io.github.truenine.composeserver.oss.ObjectVersionListing
-import io.github.truenine.composeserver.oss.PartInfo
-import io.github.truenine.composeserver.oss.PutObjectRequest
-import io.github.truenine.composeserver.oss.QuotaExceededException
-import io.github.truenine.composeserver.oss.ServiceUnavailableException
-import io.github.truenine.composeserver.oss.ShareLinkInfo
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.StorageClass
import io.github.truenine.composeserver.oss.Tag
-import io.github.truenine.composeserver.oss.UploadPartRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkResponse
import java.io.InputStream
import java.net.URI
import java.time.Duration
@@ -125,7 +55,21 @@ class VolcengineTosObjectStorageService(private val tosClient: TOSV2, override v
}
override suspend fun deleteBucket(bucketName: String): Result =
- execute("Failed to delete bucket $bucketName") { tosClient.deleteBucket(DeleteBucketInput().setBucket(bucketName)) }
+ execute("Failed to delete bucket $bucketName") {
+ try {
+ tosClient.deleteBucket(DeleteBucketInput().setBucket(bucketName))
+ } catch (e: Exception) {
+ // If the bucket doesn't exist, consider it a successful deletion
+ val mapped = mapTosException(e)
+ if (mapped is BucketNotFoundException) {
+ // Successfully deleted a non-existent bucket
+ return@execute Unit
+ } else {
+ // Re-throw other exceptions
+ throw e
+ }
+ }
+ }
override suspend fun bucketExists(bucketName: String): Result =
withContext(Dispatchers.IO) {
diff --git a/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/autoconfig/VolcengineTosAutoConfiguration.kt b/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/autoconfig/VolcengineTosAutoConfiguration.kt
index 58246d2e6..2aedf0bae 100644
--- a/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/autoconfig/VolcengineTosAutoConfiguration.kt
+++ b/oss/oss-volcengine-tos/src/main/kotlin/io/github/truenine/composeserver/oss/volcengine/autoconfig/VolcengineTosAutoConfiguration.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.oss.volcengine.autoconfig
-import com.volcengine.tos.TOSClientConfiguration
-import com.volcengine.tos.TOSV2
-import com.volcengine.tos.TOSV2ClientBuilder
+import com.volcengine.tos.*
import com.volcengine.tos.auth.StaticCredentials
import com.volcengine.tos.transport.TransportConfig
import io.github.truenine.composeserver.logger
diff --git a/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageServiceTest.kt b/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageServiceTest.kt
index f118fee00..2814a3c37 100644
--- a/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageServiceTest.kt
+++ b/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosObjectStorageServiceTest.kt
@@ -1,56 +1,14 @@
package io.github.truenine.composeserver.oss.volcengine
import com.volcengine.tos.TOSV2
-import com.volcengine.tos.model.bucket.CreateBucketV2Input
-import com.volcengine.tos.model.bucket.CreateBucketV2Output
-import com.volcengine.tos.model.bucket.DeleteBucketInput
-import com.volcengine.tos.model.bucket.DeleteBucketOutput
-import com.volcengine.tos.model.bucket.GetBucketPolicyInput
-import com.volcengine.tos.model.bucket.GetBucketPolicyOutput
-import com.volcengine.tos.model.bucket.HeadBucketV2Input
-import com.volcengine.tos.model.bucket.HeadBucketV2Output
-import com.volcengine.tos.model.bucket.ListBucketsV2Input
-import com.volcengine.tos.model.bucket.ListBucketsV2Output
-import com.volcengine.tos.model.bucket.ListedBucket
-import com.volcengine.tos.model.bucket.PutBucketACLInput
-import com.volcengine.tos.model.bucket.PutBucketACLOutput
-import com.volcengine.tos.model.bucket.PutBucketPolicyInput
-import com.volcengine.tos.model.bucket.PutBucketPolicyOutput
-import com.volcengine.tos.model.`object`.CopyObjectV2Input
-import com.volcengine.tos.model.`object`.CopyObjectV2Output
-import com.volcengine.tos.model.`object`.DeleteObjectInput
-import com.volcengine.tos.model.`object`.DeleteObjectOutput
-import com.volcengine.tos.model.`object`.GetObjectV2Input
-import com.volcengine.tos.model.`object`.GetObjectV2Output
-import com.volcengine.tos.model.`object`.HeadObjectV2Input
-import com.volcengine.tos.model.`object`.HeadObjectV2Output
-import com.volcengine.tos.model.`object`.ListObjectsV2Input
-import com.volcengine.tos.model.`object`.ListObjectsV2Output
-import com.volcengine.tos.model.`object`.ListedObjectV2
-import com.volcengine.tos.model.`object`.PreSignedURLInput
-import com.volcengine.tos.model.`object`.PreSignedURLOutput
-import com.volcengine.tos.model.`object`.PutObjectInput
-import com.volcengine.tos.model.`object`.PutObjectOutput
+import com.volcengine.tos.model.bucket.*
+import com.volcengine.tos.model.`object`.*
import io.github.truenine.composeserver.enums.HttpMethod
-import io.github.truenine.composeserver.oss.BucketAccessLevel
-import io.github.truenine.composeserver.oss.CompleteMultipartUploadRequest
-import io.github.truenine.composeserver.oss.CopyObjectRequest
-import io.github.truenine.composeserver.oss.CreateBucketRequest
-import io.github.truenine.composeserver.oss.InitiateMultipartUploadRequest
-import io.github.truenine.composeserver.oss.ListObjectsRequest
-import io.github.truenine.composeserver.oss.PartInfo
-import io.github.truenine.composeserver.oss.PutObjectRequest
-import io.github.truenine.composeserver.oss.ShareLinkRequest
-import io.github.truenine.composeserver.oss.UploadPartRequest
-import io.github.truenine.composeserver.oss.UploadWithLinkRequest
-import io.mockk.clearAllMocks
-import io.mockk.every
-import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import io.github.truenine.composeserver.oss.*
+import io.mockk.*
+import kotlin.test.*
import kotlin.test.assertNotNull
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
diff --git a/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosPropertiesTest.kt b/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosPropertiesTest.kt
index 81d6a0828..deaef13a8 100644
--- a/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosPropertiesTest.kt
+++ b/oss/oss-volcengine-tos/src/test/kotlin/io/github/truenine/composeserver/oss/volcengine/VolcengineTosPropertiesTest.kt
@@ -1,10 +1,8 @@
package io.github.truenine.composeserver.oss.volcengine
import io.github.truenine.composeserver.oss.volcengine.properties.VolcengineTosProperties
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
diff --git a/pay/pay-shared/build.gradle.kts b/pay/pay-shared/build.gradle.kts
index 2f728e0c8..dcc2e8349 100644
--- a/pay/pay-shared/build.gradle.kts
+++ b/pay/pay-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/pay/pay-wechat/build.gradle.kts b/pay/pay-wechat/build.gradle.kts
index a7a26e52c..3214d0dab 100644
--- a/pay/pay-wechat/build.gradle.kts
+++ b/pay/pay-wechat/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/autoconfig/WeChatPaySingleAutoConfiguration.kt b/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/autoconfig/WeChatPaySingleAutoConfiguration.kt
index 984e0eebf..2943817df 100644
--- a/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/autoconfig/WeChatPaySingleAutoConfiguration.kt
+++ b/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/autoconfig/WeChatPaySingleAutoConfiguration.kt
@@ -3,16 +3,12 @@ package io.github.truenine.composeserver.pay.wechat.autoconfig
import com.wechat.pay.java.core.RSAAutoCertificateConfig
import com.wechat.pay.java.service.payments.jsapi.JsapiService
import com.wechat.pay.java.service.refund.RefundService
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.pay.wechat.properties.WeChatPayProperties
import io.github.truenine.composeserver.pay.wechat.properties.WeChatPaySingleConfigProperty
-import io.github.truenine.composeserver.resourceAsStream
-import io.github.truenine.composeserver.slf4j
-import io.github.truenine.composeserver.utf8String
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.DependsOn
+import org.springframework.context.annotation.*
import org.springframework.core.io.ClassPathResource
private val log = slf4j(WeChatPaySingleAutoConfiguration::class)
diff --git a/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/service/impl/WeChatSinglePayService.kt b/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/service/impl/WeChatSinglePayService.kt
index fb590fbe7..18bfba6fd 100644
--- a/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/service/impl/WeChatSinglePayService.kt
+++ b/pay/pay-wechat/src/main/kotlin/io/github/truenine/composeserver/pay/wechat/service/impl/WeChatSinglePayService.kt
@@ -5,28 +5,17 @@ import com.wechat.pay.java.core.notification.NotificationParser
import com.wechat.pay.java.core.notification.RequestParam
import com.wechat.pay.java.service.partnerpayments.app.model.Transaction
import com.wechat.pay.java.service.payments.jsapi.JsapiService
-import com.wechat.pay.java.service.payments.jsapi.model.Amount
-import com.wechat.pay.java.service.payments.jsapi.model.Payer
-import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest
-import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest
-import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest
+import com.wechat.pay.java.service.payments.jsapi.model.*
import com.wechat.pay.java.service.refund.RefundService
import com.wechat.pay.java.service.refund.model.AmountReq
import com.wechat.pay.java.service.refund.model.CreateRequest
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.enums.EncryptAlgorithm
import io.github.truenine.composeserver.enums.ISO4217
import io.github.truenine.composeserver.generator.IOrderCodeGenerator
-import io.github.truenine.composeserver.hasText
-import io.github.truenine.composeserver.iso8601LongUtc
-import io.github.truenine.composeserver.pay.FindPayOrderDto
-import io.github.truenine.composeserver.pay.FindPayOrderVo
-import io.github.truenine.composeserver.pay.PaySuccessNotifyVo
-import io.github.truenine.composeserver.pay.SinglePayService
+import io.github.truenine.composeserver.pay.*
import io.github.truenine.composeserver.pay.wechat.properties.WeChatPaySingleConfigProperty
-import io.github.truenine.composeserver.security.crypto.CryptographicKeyManager
-import io.github.truenine.composeserver.security.crypto.CryptographicOperations
-import io.github.truenine.composeserver.security.crypto.encodeBase64String
-import io.github.truenine.composeserver.slf4j
+import io.github.truenine.composeserver.security.crypto.*
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import java.math.BigDecimal
diff --git a/psdk/psdk-wxpa/build.gradle.kts b/psdk/psdk-wxpa/build.gradle.kts
index a9d7cd302..5f188169c 100644
--- a/psdk/psdk-wxpa/build.gradle.kts
+++ b/psdk/psdk-wxpa/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/autoconfig/WxpaAutoConfiguration.kt b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/autoconfig/WxpaAutoConfiguration.kt
index dfd20a6fa..8f1a0d95f 100644
--- a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/autoconfig/WxpaAutoConfiguration.kt
+++ b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/autoconfig/WxpaAutoConfiguration.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.psdk.wxpa.autoconfig
import io.github.truenine.composeserver.consts.SpringBootConfigurationPropertiesPrefixes
import io.github.truenine.composeserver.logger
import io.github.truenine.composeserver.psdk.wxpa.api.IWxpaWebClient
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaSignatureGenerator
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaTokenManager
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaUserInfoService
+import io.github.truenine.composeserver.psdk.wxpa.core.*
import io.github.truenine.composeserver.psdk.wxpa.event.WxpaTokenEventManager
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaConfigurationException
import io.github.truenine.composeserver.psdk.wxpa.properties.WechatProperties
diff --git a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGenerator.kt b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGenerator.kt
index ee2b14ace..431164d80 100644
--- a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGenerator.kt
+++ b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGenerator.kt
@@ -1,13 +1,11 @@
package io.github.truenine.composeserver.psdk.wxpa.core
-import io.github.truenine.composeserver.datetime
-import io.github.truenine.composeserver.iso8601LongUtc
+import io.github.truenine.composeserver.*
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaSignatureException
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaSignature
import io.github.truenine.composeserver.psdk.wxpa.properties.WxpaProperties
import io.github.truenine.composeserver.security.crypto.CryptographicKeyManager
import io.github.truenine.composeserver.security.crypto.sha1
-import io.github.truenine.composeserver.slf4j
private val log = slf4j()
diff --git a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManager.kt b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManager.kt
index 4ae1fd2c4..1471b7783 100644
--- a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManager.kt
+++ b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManager.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.psdk.wxpa.core
import io.github.truenine.composeserver.holders.EventPublisherHolder
import io.github.truenine.composeserver.psdk.wxpa.api.IWxpaWebClient
-import io.github.truenine.composeserver.psdk.wxpa.event.TokenExpiredEvent
-import io.github.truenine.composeserver.psdk.wxpa.event.TokenType
-import io.github.truenine.composeserver.psdk.wxpa.event.TokenUsedEvent
+import io.github.truenine.composeserver.psdk.wxpa.event.*
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaApiException
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaTokenException
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaTicket
diff --git a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaService.kt b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaService.kt
index 3fe7e3b32..4a5459fc6 100644
--- a/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaService.kt
+++ b/psdk/psdk-wxpa/src/main/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaService.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.psdk.wxpa.service
import io.github.truenine.composeserver.logger
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaSignatureGenerator
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaTokenManager
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaUserInfoService
+import io.github.truenine.composeserver.psdk.wxpa.core.*
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaSignature
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaUserInfo
import org.springframework.stereotype.Service
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGeneratorTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGeneratorTest.kt
index 8f475f073..20fd4e660 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGeneratorTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaSignatureGeneratorTest.kt
@@ -5,10 +5,8 @@ import io.github.truenine.composeserver.psdk.wxpa.properties.WxpaProperties
import io.github.truenine.composeserver.security.crypto.sha1
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManagerTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManagerTest.kt
index f7e6587f3..e83a06e4c 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManagerTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaTokenManagerTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.psdk.wxpa.api.IWxpaWebClient
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaApiException
import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaTokenException
import io.github.truenine.composeserver.psdk.wxpa.properties.WxpaProperties
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
+import io.mockk.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaUserInfoServiceTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaUserInfoServiceTest.kt
index b0451b31a..c1527fce2 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaUserInfoServiceTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/core/WxpaUserInfoServiceTest.kt
@@ -4,11 +4,9 @@ import io.github.truenine.composeserver.psdk.wxpa.api.IWxpaWebClient
import io.github.truenine.composeserver.psdk.wxpa.properties.WxpaProperties
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventManagerTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventManagerTest.kt
index 366ad4f2a..5f5d5a648 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventManagerTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventManagerTest.kt
@@ -5,10 +5,7 @@ import io.github.truenine.composeserver.psdk.wxpa.core.WxpaTokenManager
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaTicket
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaToken
import io.github.truenine.composeserver.psdk.wxpa.properties.WxpaProperties
-import io.mockk.clearAllMocks
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
+import io.mockk.*
import java.time.Duration
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventTest.kt
index 7c519e925..879cea757 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/event/WxpaTokenEventTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.psdk.wxpa.event
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaTicket
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaToken
import java.time.LocalDateTime
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/integration/WxpaIntegrationTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/integration/WxpaIntegrationTest.kt
index aed53c230..582396d31 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/integration/WxpaIntegrationTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/integration/WxpaIntegrationTest.kt
@@ -7,11 +7,9 @@ import io.github.truenine.composeserver.psdk.wxpa.exception.WxpaApiException
import io.github.truenine.composeserver.psdk.wxpa.service.WxpaService
import io.github.truenine.composeserver.security.crypto.sha1
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
diff --git a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaServiceTest.kt b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaServiceTest.kt
index b4de9c331..e0b6578ea 100644
--- a/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaServiceTest.kt
+++ b/psdk/psdk-wxpa/src/test/kotlin/io/github/truenine/composeserver/psdk/wxpa/service/WxpaServiceTest.kt
@@ -1,13 +1,9 @@
package io.github.truenine.composeserver.psdk.wxpa.service
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaSignatureGenerator
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaTokenManager
-import io.github.truenine.composeserver.psdk.wxpa.core.WxpaUserInfoService
+import io.github.truenine.composeserver.psdk.wxpa.core.*
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaSignature
import io.github.truenine.composeserver.psdk.wxpa.model.WxpaUserInfo
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
+import io.mockk.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
diff --git a/rds/rds-crud/build.gradle.kts b/rds/rds-crud/build.gradle.kts
index a39d5f863..96980dee6 100644
--- a/rds/rds-crud/build.gradle.kts
+++ b/rds/rds-crud/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
alias(libs.plugins.com.google.devtools.ksp)
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TestEntity.kt b/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TestEntity.kt
index 9baa8f4b5..862a34b66 100644
--- a/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TestEntity.kt
+++ b/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TestEntity.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver.rds.crud.transaction
-import org.babyfish.jimmer.sql.Entity
-import org.babyfish.jimmer.sql.GeneratedValue
-import org.babyfish.jimmer.sql.GenerationType
-import org.babyfish.jimmer.sql.Id
+import org.babyfish.jimmer.sql.*
@Entity
interface TestEntity {
diff --git a/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TransactionTest.kt b/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TransactionTest.kt
index 7fe4ab5c7..5679768ff 100644
--- a/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TransactionTest.kt
+++ b/rds/rds-crud/src/test/kotlin/io/github/truenine/composeserver/rds/crud/transaction/TransactionTest.kt
@@ -3,11 +3,7 @@ package io.github.truenine.composeserver.rds.crud.transaction
import io.github.truenine.composeserver.testtoolkit.RDBRollback
import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabasePostgresqlContainer
import jakarta.annotation.Resource
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
diff --git a/rds/rds-flyway-migration-mysql8/build.gradle.kts b/rds/rds-flyway-migration-mysql8/build.gradle.kts
index f73bb7175..5c475d90d 100644
--- a/rds/rds-flyway-migration-mysql8/build.gradle.kts
+++ b/rds/rds-flyway-migration-mysql8/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
alias(libs.plugins.com.google.devtools.ksp)
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
id("buildlogic.spotless-sql-conventions")
}
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/IdempotencyTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/IdempotencyTest.kt
index dd7d5fef0..b4b1307a4 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/IdempotencyTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/IdempotencyTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/TestFlywayConfiguration.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/TestFlywayConfiguration.kt
index d70341453..fd62bbca5 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/TestFlywayConfiguration.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/TestFlywayConfiguration.kt
@@ -4,9 +4,7 @@ import javax.sql.DataSource
import org.flywaydb.core.Flyway
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.flyway.autoconfigure.FlywayMigrationInitializer
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
@Configuration
@ConditionalOnClass(Flyway::class)
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V1CtIdxTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V1CtIdxTest.kt
index 34e4acf4a..f850b5cb9 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V1CtIdxTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V1CtIdxTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V2BaseStructTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V2BaseStructTest.kt
index 02cd29bdf..c1f4b743c 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V2BaseStructTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V2BaseStructTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V3TreeStructTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V3TreeStructTest.kt
index 5b1cf4178..3a0d9fa6a 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V3TreeStructTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V3TreeStructTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V4PresortTreeStructTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V4PresortTreeStructTest.kt
index db4f51683..00e15b454 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V4PresortTreeStructTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V4PresortTreeStructTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V5AllToNullableTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V5AllToNullableTest.kt
index 6d6f000db..142362b74 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V5AllToNullableTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/V5AllToNullableTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddBaseStructMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddBaseStructMigrationTest.kt
index 61d3feae2..252959009 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddBaseStructMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddBaseStructMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddPresortTreeStructMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddPresortTreeStructMigrationTest.kt
index cc4f3813c..ec7c78ae3 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddPresortTreeStructMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddPresortTreeStructMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddTreeStructMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddTreeStructMigrationTest.kt
index b0e6d937d..33c5b61b3 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddTreeStructMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AddTreeStructMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AllToNullableMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AllToNullableMigrationTest.kt
index 129bd902b..561ced7fd 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AllToNullableMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/AllToNullableMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/BaseStructToJimmerStyleMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/BaseStructToJimmerStyleMigrationTest.kt
index ea55c0626..e0e4d94de 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/BaseStructToJimmerStyleMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/BaseStructToJimmerStyleMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/CtIdxMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/CtIdxMigrationTest.kt
index 882ec73ac..3ddd54e30 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/CtIdxMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/CtIdxMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmBaseStructMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmBaseStructMigrationTest.kt
index 443da0b4c..e5252e1f5 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmBaseStructMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmBaseStructMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmPresortTreeStructMigrationTest.kt b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmPresortTreeStructMigrationTest.kt
index e7eb5c31a..c4c7b0842 100644
--- a/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmPresortTreeStructMigrationTest.kt
+++ b/rds/rds-flyway-migration-mysql8/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationmysql8/flyway/RmPresortTreeStructMigrationTest.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabaseMysq
import jakarta.annotation.Resource
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.test.annotation.Rollback
diff --git a/rds/rds-flyway-migration-postgresql/build.gradle.kts b/rds/rds-flyway-migration-postgresql/build.gradle.kts
index 5a69a28d2..4c0789da7 100644
--- a/rds/rds-flyway-migration-postgresql/build.gradle.kts
+++ b/rds/rds-flyway-migration-postgresql/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
alias(libs.plugins.com.google.devtools.ksp)
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
id("buildlogic.spotless-sql-conventions")
}
diff --git a/rds/rds-flyway-migration-shared/CLAUDE.md b/rds/rds-flyway-migration-shared/CLAUDE.md
deleted file mode 100644
index 318874a9f..000000000
--- a/rds/rds-flyway-migration-shared/CLAUDE.md
+++ /dev/null
@@ -1,168 +0,0 @@
-# CLAUDE.md
-
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this Module.
-
-## Overview
-
-The `flyway-migration-shared` module defines common specifications and implementation requirements for database migration in the framework. This module provides unified implementation standards for database structure management functions/stored procedures across different database systems (PostgreSQL, MySQL, Oracle, SQL Server, etc.).
-
-## `ct_idx` Function/Stored Procedure
-
-Creates an index for a specified column in a specified table (if the column exists and the index does not exist). Supports idempotent operations and can be called repeatedly without errors.
-
-**Parameters:**
-
-- `tab_name`: Table name (varchar(128))
-- `col_name`: Column name (varchar(255))
-
-**Implementation Logic:**
-
-1. Check if the specified column exists in the specified table
-2. If the column exists, check if a corresponding index already exists
-3. Create the index only when the column exists and the index does not exist
-4. Index naming convention: `{col_name}_idx`
-
-**Core SQL Operations:**
-
-- Column existence check: `select column_name from information_schema.columns where table_name = ? and column_name = ?`
-- Index existence check: `select index_name from information_schema.statistics where table_name = ? and index_name = ?`
-- Index creation: `create index {col_name}_idx on {tab_name} ({col_name})`
-
-## `add_base_struct` Function/Stored Procedure
-
-**Function:** Add Compose Server standard base fields to a table
-
-**Parameters:**
-
-- `tab_name`: Table name (VARCHAR(128))
-
-**Standard Fields:**
-
-- `id`: Primary key field (BIGINT NOT NULL PRIMARY KEY), default value is non-auto-increment int64 type, **must not set any auto-increment strategy, should be handled by the application**
-- `rlv`: Row Lock Version (INT DEFAULT 0), default value is 0 of int32 type, cannot be NULL
-- `crd`: Created Row Datetime (TIMESTAMP DEFAULT CURRENT_TIMESTAMP), timezone-independent millisecond timestamp, default value is the timestamp when the table record is inserted
-- `mrd`: Modify Row Datetime (TIMESTAMP DEFAULT null), timezone-independent millisecond timestamp, default is null
-- `ldf`: Logic Delete Flag (TIMESTAMP NULL DEFAULT NULL)
-
-**Implementation Requirements:**
-
-- Check if fields already exist to avoid duplicate additions
-- For tables with existing data, properly handle the addition of the ID field
- - PostgreSQL: Use temporary sequence to generate IDs for existing data
- - MySQL: Use AUTO_INCREMENT feature
-- Support idempotent operations
-
-## `rm_base_struct` Function/Stored Procedure
-
-**Function:** Remove base structure fields from a table
-
-**Parameters:**
-
-- `tab_name`: Table name (VARCHAR(128))
-
-**Implementation Requirements:**
-
-- Remove fields in the correct order (remove constraints first, then remove fields)
-- Safely handle primary key constraint deletion
-- Support idempotent operations
-
-## `add_tree_struct` Function/Stored Procedure
-
-**Function:** Add tree structure support fields to a table
-
-**Parameters:**
-
-- `tab_name`: Table name (VARCHAR(128))
-
-**Tree Structure Fields:**
-
-- `rpi`: Row Parent Id (BIGINT DEFAULT NULL)
-
-**Implementation Requirements:**
-
-- Create index for `rpi` field
-- Support idempotent operations
-
-## `add_presort_tree_struct` Function/Stored Procedure
-
-**Function:** Add pre-sorted tree structure support fields to a table
-
-**Parameters:**
-
-- `tab_name`: Table name (VARCHAR(128))
-
-**Pre-sorted Tree Fields:**
-
-- `rpi`: Row Parent Id (BIGINT DEFAULT NULL)
-- `rln`: Row Left Node (BIGINT DEFAULT 1)
-- `rrn`: Row Right Node (BIGINT DEFAULT 2)
-- `nlv`: Node Level (INT DEFAULT 0)
-- `tgi`: Tree Group Id (VARCHAR(255))
-
-**Implementation Requirements:**
-
-- Create corresponding indexes for all fields
-- Support nested set model tree structure
-- Support idempotent operations
-
-## `all_to_nullable` Function/Stored Procedure
-
-**Function:** Set all non-primary key fields in a table to nullable
-
-**Parameters:**
-
-- `tab_name`: Table name (VARCHAR(128))
-
-**Implementation Requirements:**
-
-- Exclude primary key fields
-- Remove NOT NULL constraints from fields
-- Remove default values from fields
-- Support idempotent operations
-
-## Implementation Specifications
-
-### General Requirements
-
-1. **Idempotency**: All functions/stored procedures must support repeated execution without errors
-2. **Security**: Use parameterized queries to prevent SQL injection
-3. **Error Handling**: Properly handle exceptional situations and provide meaningful error messages
-4. **Performance**: Check if objects exist before operations to avoid unnecessary operations
-5. **Version Inclusion**: add functions and rm functions should appear in the same version .sql file
-
-### Database-Specific Requirements
-
-#### PostgreSQL
-
-- Use PL/pgSQL language
-- Use `format()` function for dynamic SQL construction
-- Use `%I` identifier escaping to prevent injection
-- Support array operations and loop structures
-
-#### Postgresql
-
-**Function:** Provide implicit conversions between common data types
-
-**Supported Conversions:**
-
-- json ↔ varchar
-- bigint ↔ varchar
-
-**Implementation Requirements:**
-
-- Use `with inout as implicit` syntax
-- Delete existing conversions first, then create new ones
-
-#### MySQL
-
-- Use stored procedure syntax
-- Use `delimiter` to handle statement separators
-- Use prepared statements to execute dynamic SQL
-- Use `information_schema` for metadata queries
-
-### Naming Conventions
-
-- Function/stored procedure names use lowercase letters separated by underscores
-- Index naming: `{column_name}_idx`
-- Constraint naming follows database default rules
-- Temporary objects use `temp_` prefix
diff --git a/rds/rds-flyway-migration-shared/build.gradle.kts b/rds/rds-flyway-migration-shared/build.gradle.kts
index 254d73f0b..d091886ce 100644
--- a/rds/rds-flyway-migration-shared/build.gradle.kts
+++ b/rds/rds-flyway-migration-shared/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
alias(libs.plugins.com.google.devtools.ksp)
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/rds/rds-flyway-migration-shared/src/main/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfiguration.kt b/rds/rds-flyway-migration-shared/src/main/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfiguration.kt
index e13b19249..2b17dee5e 100644
--- a/rds/rds-flyway-migration-shared/src/main/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfiguration.kt
+++ b/rds/rds-flyway-migration-shared/src/main/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfiguration.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.rds.flywaymigrationshared.autoconfig
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.flyway.autoconfigure.FlywayProperties
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
@Configuration
class FlywayPropertiesOverrideAutoConfiguration {
diff --git a/rds/rds-flyway-migration-shared/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfigurationTest.kt b/rds/rds-flyway-migration-shared/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfigurationTest.kt
index ffe8f8a03..727033c45 100644
--- a/rds/rds-flyway-migration-shared/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfigurationTest.kt
+++ b/rds/rds-flyway-migration-shared/src/test/kotlin/io/github/truenine/composeserver/rds/flywaymigrationshared/autoconfig/FlywayPropertiesOverrideAutoConfigurationTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.rds.flywaymigrationshared.autoconfig
import io.github.truenine.composeserver.rds.flywaymigrationshared.TestEntrance
import io.github.truenine.composeserver.testtoolkit.testcontainers.IDatabasePostgresqlContainer
import jakarta.annotation.Resource
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.boot.flyway.autoconfigure.FlywayProperties
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.ApplicationContext
diff --git a/rds/rds-jimmer-ext-postgres/build.gradle.kts b/rds/rds-jimmer-ext-postgres/build.gradle.kts
index beecaaf58..7d89204c8 100644
--- a/rds/rds-jimmer-ext-postgres/build.gradle.kts
+++ b/rds/rds-jimmer-ext-postgres/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/rds/rds-jimmer-ext-postgres/src/main/kotlin/io/github/truenine/composeserver/rds/jimmerextpostgres/StringFns.kt b/rds/rds-jimmer-ext-postgres/src/main/kotlin/io/github/truenine/composeserver/rds/jimmerextpostgres/StringFns.kt
index 86730b443..d5aaef06a 100644
--- a/rds/rds-jimmer-ext-postgres/src/main/kotlin/io/github/truenine/composeserver/rds/jimmerextpostgres/StringFns.kt
+++ b/rds/rds-jimmer-ext-postgres/src/main/kotlin/io/github/truenine/composeserver/rds/jimmerextpostgres/StringFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.rds.jimmerextpostgres
-import org.babyfish.jimmer.sql.kt.ast.expression.KNonNullExpression
-import org.babyfish.jimmer.sql.kt.ast.expression.KNullablePropExpression
-import org.babyfish.jimmer.sql.kt.ast.expression.sql
+import org.babyfish.jimmer.sql.kt.ast.expression.*
/**
* ## Raw substr
diff --git a/rds/rds-shared/build.gradle.kts b/rds/rds-shared/build.gradle.kts
index de0ab6988..c14f5a17e 100644
--- a/rds/rds-shared/build.gradle.kts
+++ b/rds/rds-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
alias(libs.plugins.com.google.devtools.ksp)
id("buildlogic.spotless-conventions")
}
diff --git a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/SpringPageExtensions.kt b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/SpringPageExtensions.kt
index 81329b7f5..7f0a44965 100644
--- a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/SpringPageExtensions.kt
+++ b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/SpringPageExtensions.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.rds
import io.github.truenine.composeserver.Pq
import io.github.truenine.composeserver.Pr
import io.github.truenine.composeserver.domain.IPage
-import org.springframework.data.domain.Page
-import org.springframework.data.domain.PageRequest
-import org.springframework.data.domain.Pageable
+import org.springframework.data.domain.*
/** # Wrap paging result into a wrapper object */
@Deprecated("Use toPr or toIPage which are more idiomatic for Kotlin", replaceWith = ReplaceWith("toPr()", "io.github.truenine.composeserver.rds.toPr"))
diff --git a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/autoconfig/JimmerAutoConfiguration.kt b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/autoconfig/JimmerAutoConfiguration.kt
index 20ac797f3..671f8f791 100644
--- a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/autoconfig/JimmerAutoConfiguration.kt
+++ b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/autoconfig/JimmerAutoConfiguration.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.rds.autoconfig
import io.github.truenine.composeserver.generator.ISnowflakeGenerator
-import io.github.truenine.composeserver.rds.converters.DurationScalarProvider
-import io.github.truenine.composeserver.rds.converters.IIntEnumJimmerProvider
-import io.github.truenine.composeserver.rds.converters.IStringEnumJimmerProvider
-import io.github.truenine.composeserver.rds.converters.PeriodScalarProvider
+import io.github.truenine.composeserver.rds.converters.*
import io.github.truenine.composeserver.rds.generators.JimmerSnowflakeLongIdGenerator
import io.github.truenine.composeserver.rds.generators.JimmerSnowflakeStringIdGenerator
import io.github.truenine.composeserver.rds.interceptors.JimmerEntityDraftInterceptor
diff --git a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IEntity.kt b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IEntity.kt
index aff101443..2807676d9 100644
--- a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IEntity.kt
+++ b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IEntity.kt
@@ -1,11 +1,7 @@
package io.github.truenine.composeserver.rds.entities
import io.github.truenine.composeserver.instant
-import org.babyfish.jimmer.sql.Column
-import org.babyfish.jimmer.sql.Default
-import org.babyfish.jimmer.sql.LogicalDeleted
-import org.babyfish.jimmer.sql.MappedSuperclass
-import org.babyfish.jimmer.sql.Version
+import org.babyfish.jimmer.sql.*
@MappedSuperclass
interface IEntity : IPersistentEntity {
diff --git a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IPersistentEntity.kt b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IPersistentEntity.kt
index 3bc165db1..87c91b901 100644
--- a/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IPersistentEntity.kt
+++ b/rds/rds-shared/src/main/kotlin/io/github/truenine/composeserver/rds/entities/IPersistentEntity.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.RefId
import io.github.truenine.composeserver.rds.converters.JimmerLongToStringConverter
import io.github.truenine.composeserver.rds.generators.JimmerSnowflakeLongIdGenerator
import org.babyfish.jimmer.jackson.JsonConverter
-import org.babyfish.jimmer.sql.GeneratedValue
-import org.babyfish.jimmer.sql.Id
-import org.babyfish.jimmer.sql.MappedSuperclass
+import org.babyfish.jimmer.sql.*
@MappedSuperclass
interface IPersistentEntity {
diff --git a/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/DisRuleFnsTest.kt b/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/DisRuleFnsTest.kt
index 000c9c780..303150fb5 100644
--- a/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/DisRuleFnsTest.kt
+++ b/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/DisRuleFnsTest.kt
@@ -2,11 +2,7 @@ package io.github.truenine.composeserver.rds
import io.github.truenine.composeserver.domain.DisRule
import io.github.truenine.composeserver.rds.enums.DisTyping
-import kotlin.test.assertContentEquals
-import kotlin.test.assertEquals
-import kotlin.test.assertFails
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import tools.jackson.databind.ObjectMapper
import tools.jackson.module.kotlin.readValue
diff --git a/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/converters/PeriodScalarProviderTest.kt b/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/converters/PeriodScalarProviderTest.kt
index 55c44c6a1..ed98adcd3 100644
--- a/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/converters/PeriodScalarProviderTest.kt
+++ b/rds/rds-shared/src/test/kotlin/io/github/truenine/composeserver/rds/converters/PeriodScalarProviderTest.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.rds.converters
import java.time.Period
import java.time.format.DateTimeParseException
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
+import kotlin.test.*
class PeriodScalarProviderTest {
diff --git a/security/security-casbin/build.gradle.kts b/security/security-casbin/build.gradle.kts
index 4e762a9cd..42b034f0b 100644
--- a/security/security-casbin/build.gradle.kts
+++ b/security/security-casbin/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/security/security-crypto/build.gradle.kts b/security/security-crypto/build.gradle.kts
index fdc95545e..002acd749 100644
--- a/security/security-crypto/build.gradle.kts
+++ b/security/security-crypto/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/AutoGeneratedKeysRepo.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/AutoGeneratedKeysRepo.kt
index df2d4af48..dfd821e2a 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/AutoGeneratedKeysRepo.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/AutoGeneratedKeysRepo.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security.crypto
-import io.github.truenine.composeserver.security.crypto.domain.IEccExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.IKeysRepo
-import io.github.truenine.composeserver.security.crypto.domain.IRsaExtKeyPair
+import io.github.truenine.composeserver.security.crypto.domain.*
import io.github.truenine.composeserver.slf4j
import javax.crypto.spec.SecretKeySpec
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManager.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManager.kt
index 20f230291..892967bdc 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManager.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManager.kt
@@ -1,18 +1,9 @@
package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.enums.EncryptAlgorithm
-import io.github.truenine.composeserver.security.crypto.domain.EccExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.IEccExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.IRsaExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.RsaExtKeyPair
+import io.github.truenine.composeserver.security.crypto.domain.*
import io.github.truenine.composeserver.slf4j
-import java.security.Key
-import java.security.KeyFactory
-import java.security.KeyPairGenerator
-import java.security.PrivateKey
-import java.security.PublicKey
-import java.security.SecureRandom
-import java.security.Security
+import java.security.*
import java.security.interfaces.RSAPrivateKey
import java.security.interfaces.RSAPublicKey
import java.security.spec.PKCS8EncodedKeySpec
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperations.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperations.kt
index fd06e1f05..f337778f9 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperations.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperations.kt
@@ -3,11 +3,7 @@ package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.enums.EncryptAlgorithm
import io.github.truenine.composeserver.slf4j
import java.nio.charset.Charset
-import java.security.MessageDigest
-import java.security.PrivateKey
-import java.security.PublicKey
-import java.security.SecureRandom
-import java.security.Signature
+import java.security.*
import java.security.interfaces.RSAPrivateKey
import java.security.interfaces.RSAPublicKey
import javax.crypto.Cipher
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeyRepo.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeyRepo.kt
index bc273a781..5baac188b 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeyRepo.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeyRepo.kt
@@ -1,11 +1,7 @@
package io.github.truenine.composeserver.security.crypto
-import io.github.truenine.composeserver.security.crypto.domain.IEccExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.IKeysRepo
-import io.github.truenine.composeserver.security.crypto.domain.IRsaExtKeyPair
-import java.io.BufferedInputStream
-import java.io.BufferedReader
-import java.io.InputStreamReader
+import io.github.truenine.composeserver.security.crypto.domain.*
+import java.io.*
import java.security.PrivateKey
import java.security.PublicKey
import java.security.interfaces.RSAPrivateKey
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeysRepoImpl.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeysRepoImpl.kt
index 428ffa37a..e46ac160d 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeysRepoImpl.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/FileKeysRepoImpl.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security.crypto
-import io.github.truenine.composeserver.security.crypto.domain.IEccExtKeyPair
-import io.github.truenine.composeserver.security.crypto.domain.IKeysRepo
-import io.github.truenine.composeserver.security.crypto.domain.IRsaExtKeyPair
+import io.github.truenine.composeserver.security.crypto.domain.*
import io.github.truenine.composeserver.slf4j
import javax.crypto.spec.SecretKeySpec
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/PemFormat.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/PemFormat.kt
index 41494adbd..af620de8b 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/PemFormat.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/PemFormat.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security.crypto
-import java.security.Key
-import java.security.PrivateKey
-import java.security.PublicKey
+import java.security.*
import java.util.regex.Pattern
/**
diff --git a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/autoconfig/PasswordEncoderAutoconfiguration.kt b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/autoconfig/PasswordEncoderAutoconfiguration.kt
index 0f7e7a33c..8f1af5542 100644
--- a/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/autoconfig/PasswordEncoderAutoconfiguration.kt
+++ b/security/security-crypto/src/main/kotlin/io/github/truenine/composeserver/security/crypto/autoconfig/PasswordEncoderAutoconfiguration.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.security.crypto.autoconfig
import io.github.truenine.composeserver.slf4j
import org.springframework.context.ApplicationContext
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/ByteArrayExtensionsTest.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/ByteArrayExtensionsTest.kt
index 4065c5c07..689844c24 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/ByteArrayExtensionsTest.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/ByteArrayExtensionsTest.kt
@@ -1,12 +1,8 @@
package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.consts.IRegexes
-import java.util.Base64
-import kotlin.test.assertContentEquals
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
+import java.util.*
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.slf4j.LoggerFactory
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManagerTest.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManagerTest.kt
index 40860603d..3d19d32c0 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManagerTest.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicKeyManagerTest.kt
@@ -1,12 +1,7 @@
package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlin.time.measureTime
/**
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperationsTest.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperationsTest.kt
index f276efff9..0afff782f 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperationsTest.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/CryptographicOperationsTest.kt
@@ -2,14 +2,7 @@ package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.enums.EncryptAlgorithm
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertContentEquals
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlin.time.measureTime
/**
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/IBase64Test.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/IBase64Test.kt
index b9091729f..14752ff07 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/IBase64Test.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/IBase64Test.kt
@@ -2,15 +2,9 @@ package io.github.truenine.composeserver.security.crypto
import io.github.truenine.composeserver.consts.IRegexes
import io.github.truenine.composeserver.slf4j
-import java.util.Base64
+import java.util.*
import kotlin.system.measureTimeMillis
-import kotlin.test.Test
-import kotlin.test.assertContentEquals
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertFalse
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
private val log = slf4j()
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/PemFormatTest.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/PemFormatTest.kt
index 607f63a14..f7c2f0c76 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/PemFormatTest.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/PemFormatTest.kt
@@ -4,10 +4,8 @@ import java.security.KeyPair
import java.security.KeyPairGenerator
import java.util.stream.Stream
import kotlin.system.measureTimeMillis
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.RepeatedTest
import org.junit.jupiter.api.Test
diff --git a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/StringExtensionsTest.kt b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/StringExtensionsTest.kt
index c6cef688c..2dba24b5e 100644
--- a/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/StringExtensionsTest.kt
+++ b/security/security-crypto/src/test/kotlin/io/github/truenine/composeserver/security/crypto/StringExtensionsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security.crypto
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
/** Test cases for String extension functions */
diff --git a/security/security-oauth2/build.gradle.kts b/security/security-oauth2/build.gradle.kts
index 3641c673d..aedf2e607 100644
--- a/security/security-oauth2/build.gradle.kts
+++ b/security/security-oauth2/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/security/security-spring/build.gradle.kts b/security/security-spring/build.gradle.kts
index 5e687b0f6..c28a5823b 100644
--- a/security/security-spring/build.gradle.kts
+++ b/security/security-spring/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/SecurityPolicyDefine.kt b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/SecurityPolicyDefine.kt
index 8afabdbad..52ef4341d 100644
--- a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/SecurityPolicyDefine.kt
+++ b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/SecurityPolicyDefine.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security
-import io.github.truenine.composeserver.security.spring.security.SecurityExceptionAdware
-import io.github.truenine.composeserver.security.spring.security.SecurityPreflightValidFilter
-import io.github.truenine.composeserver.security.spring.security.SecurityUserDetailsService
+import io.github.truenine.composeserver.security.spring.security.*
import org.springframework.security.authorization.AuthorizationManager
import org.springframework.security.web.access.intercept.RequestAuthorizationContext
diff --git a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/FileKeyRepoAutoConfiguration.kt b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/FileKeyRepoAutoConfiguration.kt
index 43f061bd4..8bcb569ae 100644
--- a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/FileKeyRepoAutoConfiguration.kt
+++ b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/FileKeyRepoAutoConfiguration.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.security.autoconfig
import io.github.truenine.composeserver.security.crypto.FileKeyRepo
import io.github.truenine.composeserver.slf4j
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
@Configuration
class FileKeyRepoAutoConfiguration {
diff --git a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/JwtIssuerAutoConfiguration.kt b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/JwtIssuerAutoConfiguration.kt
index 7a4cc1582..2e76eab3c 100644
--- a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/JwtIssuerAutoConfiguration.kt
+++ b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/JwtIssuerAutoConfiguration.kt
@@ -5,9 +5,7 @@ import io.github.truenine.composeserver.security.jwt.JwtIssuer
import java.time.Duration
import java.time.temporal.ChronoUnit
import org.springframework.boot.context.properties.EnableConfigurationProperties
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
import tools.jackson.databind.ObjectMapper
@Configuration
diff --git a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/SecurityPolicyBean.kt b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/SecurityPolicyBean.kt
index 5a4b3d31e..2f5d8a4a7 100644
--- a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/SecurityPolicyBean.kt
+++ b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/autoconfig/SecurityPolicyBean.kt
@@ -2,15 +2,11 @@ package io.github.truenine.composeserver.security.autoconfig
import io.github.truenine.composeserver.security.SecurityPolicyDefine
import io.github.truenine.composeserver.security.annotations.EnableRestSecurity
-import io.github.truenine.composeserver.security.spring.security.SecurityExceptionAdware
-import io.github.truenine.composeserver.security.spring.security.SecurityPreflightValidFilter
-import io.github.truenine.composeserver.security.spring.security.SecurityUserDetailsService
+import io.github.truenine.composeserver.security.spring.security.*
import io.github.truenine.composeserver.slf4j
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
import org.springframework.context.ApplicationContext
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
+import org.springframework.context.annotation.*
import org.springframework.security.authentication.AuthenticationManager
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity
diff --git a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/spring/security/SecurityUserDetailsService.kt b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/spring/security/SecurityUserDetailsService.kt
index e7c16c182..4c23fea59 100644
--- a/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/spring/security/SecurityUserDetailsService.kt
+++ b/security/security-spring/src/main/kotlin/io/github/truenine/composeserver/security/spring/security/SecurityUserDetailsService.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.security.spring.security
import io.github.truenine.composeserver.domain.AuthRequestInfo
import io.github.truenine.composeserver.security.UserDetailsWrapper
import io.github.truenine.composeserver.slf4j
-import org.springframework.security.core.userdetails.UserDetails
-import org.springframework.security.core.userdetails.UserDetailsService
-import org.springframework.security.core.userdetails.UsernameNotFoundException
+import org.springframework.security.core.userdetails.*
abstract class SecurityUserDetailsService : UserDetailsService {
/**
diff --git a/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/AuthenticationManagerFnsTest.kt b/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/AuthenticationManagerFnsTest.kt
index c94955856..91f113ab0 100644
--- a/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/AuthenticationManagerFnsTest.kt
+++ b/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/AuthenticationManagerFnsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.security
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
+import io.mockk.*
import kotlin.test.assertEquals
import kotlin.test.assertNull
import org.junit.jupiter.api.Test
diff --git a/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/jwt/JwtIssuerVerifierTest.kt b/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/jwt/JwtIssuerVerifierTest.kt
index 26bb514a4..37e0abd2a 100644
--- a/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/jwt/JwtIssuerVerifierTest.kt
+++ b/security/security-spring/src/test/kotlin/io/github/truenine/composeserver/security/jwt/JwtIssuerVerifierTest.kt
@@ -7,12 +7,7 @@ import io.github.truenine.composeserver.security.jwt.consts.IssuerParam
import io.github.truenine.composeserver.security.jwt.consts.VerifierParam
import java.time.Duration
import java.time.temporal.ChronoUnit
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
-import kotlin.test.fail
+import kotlin.test.*
import kotlin.time.measureTime
import org.junit.jupiter.api.Test
import tools.jackson.databind.ObjectMapper
diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts
index 5dfd52f65..c58fb297b 100644
--- a/shared/build.gradle.kts
+++ b/shared/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
- id("buildlogic.publish-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
+ id("buildlogic.maven-publish-conventions")
id("buildlogic.spotless-conventions")
}
@@ -28,8 +28,16 @@ dependencies {
testImplementation(libs.org.springframework.boot.spring.boot.test.autoconfigure)
testImplementation(libs.org.jetbrains.kotlinx.kotlinx.coroutines.test)
testImplementation(libs.tools.jackson.core.jackson.databind)
+
+ // Kotest property-based testing
+ testImplementation(libs.io.kotest.kotest.runner.junit5)
+ testImplementation(libs.io.kotest.kotest.assertions.core)
+ testImplementation(libs.io.kotest.kotest.property)
}
+// Configure test framework for property-based testing
+tasks.withType { useJUnitPlatform() }
+
// Disable KAPT for test sources to avoid Jackson 3.x annotation processing issues
afterEvaluate {
tasks.findByName("kaptTestKotlin")?.enabled = false
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/Alias.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/Alias.kt
index 95e7d3ec2..ed177a736 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/Alias.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/Alias.kt
@@ -4,9 +4,7 @@ import io.github.truenine.composeserver.domain.IPage
import io.github.truenine.composeserver.domain.IPageParam
import java.math.BigDecimal
import java.math.BigInteger
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
+import java.time.*
/**
* String type alias for consistent string handling across the system.
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/DateTimeConverter.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/DateTimeConverter.kt
index efe4c7ef8..ac4ffbd7b 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/DateTimeConverter.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/DateTimeConverter.kt
@@ -1,12 +1,7 @@
package io.github.truenine.composeserver
import io.github.truenine.composeserver.DateTimeConverter.plusMillis
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneId
-import java.time.ZoneOffset
+import java.time.*
/**
* Date and time converter providing comprehensive conversion operations between different time types.
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/JavaDateTimeFns.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/JavaDateTimeFns.kt
index 4c495785c..c4b814511 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/JavaDateTimeFns.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/JavaDateTimeFns.kt
@@ -1,13 +1,6 @@
package io.github.truenine.composeserver
-import java.time.Duration
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.Period
-import java.time.ZoneId
-import java.time.ZoneOffset
+import java.time.*
import java.time.temporal.TemporalAdjusters
/**
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/JavaIoFns.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/JavaIoFns.kt
index 52198bf9c..2b77640e8 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/JavaIoFns.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/JavaIoFns.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver
-import java.io.BufferedReader
-import java.io.InputStream
-import java.io.Reader
+import java.io.*
import java.nio.charset.Charset
@Deprecated("Redundant helper, use bufferedReader() instead", replaceWith = ReplaceWith("bufferedReader()"))
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/autoconfig/IdGeneratorAutoConfiguration.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/autoconfig/IdGeneratorAutoConfiguration.kt
index 0b5354b3b..b125a445d 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/autoconfig/IdGeneratorAutoConfiguration.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/autoconfig/IdGeneratorAutoConfiguration.kt
@@ -1,14 +1,9 @@
package io.github.truenine.composeserver.autoconfig
-import io.github.truenine.composeserver.generator.IOrderCodeGenerator
-import io.github.truenine.composeserver.generator.ISnowflakeGenerator
-import io.github.truenine.composeserver.generator.SynchronizedSimpleOrderCodeGenerator
-import io.github.truenine.composeserver.generator.SynchronizedSimpleSnowflake
+import io.github.truenine.composeserver.generator.*
import io.github.truenine.composeserver.properties.SnowflakeProperties
import org.springframework.boot.context.properties.EnableConfigurationProperties
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.DependsOn
+import org.springframework.context.annotation.*
@Configuration
@EnableConfigurationProperties(SnowflakeProperties::class)
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/domain/IPageParam.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/domain/IPageParam.kt
index 87a010438..b2d6359b0 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/domain/IPageParam.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/domain/IPageParam.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.domain
-import com.fasterxml.jackson.annotation.JsonCreator
-import com.fasterxml.jackson.annotation.JsonIgnore
-import com.fasterxml.jackson.annotation.JsonProperty
+import com.fasterxml.jackson.annotation.*
import java.io.Serializable
/**
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/generator/IUUIDGenerator.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/generator/IUUIDGenerator.kt
new file mode 100644
index 000000000..413c7ef28
--- /dev/null
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/generator/IUUIDGenerator.kt
@@ -0,0 +1,77 @@
+package io.github.truenine.composeserver.generator
+
+import java.util.*
+
+/**
+ * # UUID Generator Interface
+ *
+ * Defines the contract for generating UUIDs with time-based sorting capabilities. This interface follows the same design pattern as ISnowflakeGenerator.
+ *
+ * The generator produces UUIDs that are:
+ * - Lexicographically sortable by timestamp
+ * - Globally unique
+ * - Compatible with standard UUID format
+ * - Timezone-agnostic (uses UTC/Unix epoch)
+ *
+ * @author TrueNine
+ * @since 2025-01-01
+ */
+interface IUUIDGenerator : ISerialGenerator {
+
+ /**
+ * Get current timestamp in milliseconds (timezone-agnostic). Uses System.currentTimeMillis() which returns UTC epoch time.
+ *
+ * This method can be overridden for testing purposes to provide deterministic timestamps.
+ *
+ * @return Current timestamp in milliseconds since Unix epoch (1970-01-01 00:00:00 UTC)
+ */
+ fun currentTimeMillis(): Long {
+ return System.currentTimeMillis()
+ }
+
+ /**
+ * Generate next UUID as String. The default implementation delegates to nextString().
+ *
+ * @return UUID string representation
+ */
+ override fun next(): String {
+ return nextString()
+ }
+
+ /**
+ * Generate next UUID as String. This is the primary generation method that must be implemented.
+ *
+ * Implementations should generate UUIDs that are:
+ * - Unique across all invocations
+ * - Lexicographically sortable by generation time
+ * - Thread-safe for concurrent access
+ *
+ * @return UUID string representation
+ */
+ override fun nextString(): String
+
+ /**
+ * Generate next UUID as java.util.UUID object. Converts the string representation to UUID type.
+ *
+ * This method provides compatibility with code that expects java.util.UUID objects rather than strings.
+ *
+ * @return UUID object
+ */
+ fun nextUUID(): UUID {
+ return UUID.fromString(toStandardUUIDFormat(nextString()))
+ }
+
+ /**
+ * Convert ULID string to standard UUID format (with hyphens).
+ *
+ * ULID format: 26 characters Crockford Base32 (e.g., "01AN4Z07BY79KA1307SR9X4MV3") UUID format: 36 characters with hyphens at positions 8, 13, 18, 23 (e.g.,
+ * "0188d4e4-5528-7e8c-b9a0-8c7e8c7e8c7e")
+ *
+ * This conversion enables interoperability with systems that expect standard UUID format while maintaining the benefits of ULID encoding.
+ *
+ * @param ulid ULID string (26 characters)
+ * @return Standard UUID format string (36 characters with hyphens)
+ * @throws IllegalArgumentException if the ULID string is invalid
+ */
+ fun toStandardUUIDFormat(ulid: String): String
+}
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/generator/ULIDGenerator.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/generator/ULIDGenerator.kt
new file mode 100644
index 000000000..bd18e197d
--- /dev/null
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/generator/ULIDGenerator.kt
@@ -0,0 +1,243 @@
+package io.github.truenine.composeserver.generator
+
+import java.security.SecureRandom
+
+/**
+ * # ULID Generator Implementation
+ *
+ * Thread-safe implementation of ULID (Universally Unique Lexicographically Sortable Identifier). ULID combines timestamp and randomness to create sortable
+ * unique identifiers.
+ *
+ * ## ULID Structure
+ * - 48 bits: Timestamp (milliseconds since Unix epoch)
+ * - 80 bits: Randomness
+ * - Total: 128 bits (compatible with UUID)
+ *
+ * ## String Representation
+ * - 26 characters in Crockford Base32 encoding
+ * - First 10 characters: Timestamp
+ * - Last 16 characters: Randomness
+ *
+ * ## Features
+ * - Lexicographically sortable by timestamp
+ * - Monotonic within same millisecond (when enabled)
+ * - Thread-safe for concurrent access
+ * - URL-safe (no special characters)
+ * - Case-insensitive
+ *
+ * ## Example Usage
+ *
+ * ```kotlin
+ * // Create generator with default settings
+ * val generator = ULIDGenerator()
+ * val ulid = generator.nextString()
+ * // Output: "01AN4Z07BY79KA1307SR9X4MV3"
+ *
+ * // Create generator with secure random
+ * val secureGenerator = ULIDGenerator(useSecureRandom = true)
+ *
+ * // Create generator without monotonic mode
+ * val nonMonotonicGenerator = ULIDGenerator(monotonicMode = false)
+ * ```
+ *
+ * @param useSecureRandom Whether to use SecureRandom for cryptographic strength (default: false). Set to true for security-sensitive applications where
+ * unpredictability is critical. Note: SecureRandom has performance overhead compared to standard Random.
+ * @param monotonicMode Whether to use monotonic mode for same-millisecond generation (default: true). When enabled, ULIDs generated within the same millisecond
+ * will be monotonically increasing. When disabled, each ULID uses fresh random bytes regardless of timestamp.
+ * @author TrueNine
+ * @since 2025-01-01
+ */
+open class ULIDGenerator @JvmOverloads constructor(private val useSecureRandom: Boolean = false, private val monotonicMode: Boolean = true) : IUUIDGenerator {
+
+ private val random = if (useSecureRandom) SecureRandom() else java.util.Random()
+
+ private var lastTimestamp = -1L
+ private var lastRandomBytes = ByteArray(10)
+
+ private var generatedCount = 0L
+ private var monotonicIncrementCount = 0L
+
+ init {
+ validateParameters()
+ }
+
+ private fun validateParameters() {
+ // No specific validation needed for current parameters
+ // This method is kept for consistency with SynchronizedSimpleSnowflake
+ // and for future extensibility if additional parameters are added
+ }
+
+ @Synchronized
+ override fun nextString(): String {
+ val timestamp = currentTimeMillis()
+
+ val randomBytes =
+ if (monotonicMode && timestamp == lastTimestamp) {
+ monotonicIncrementCount++
+ incrementRandomBytes(lastRandomBytes.copyOf())
+ } else {
+ generateRandomBytes()
+ }
+
+ lastTimestamp = timestamp
+ lastRandomBytes = randomBytes.copyOf()
+ generatedCount++
+
+ return encodeULID(timestamp, randomBytes)
+ }
+
+ override fun toStandardUUIDFormat(ulid: String): String {
+ require(ulid.length == 26) { "ULID must be 26 characters long, but got ${ulid.length}" }
+
+ val bytes = decodeULID(ulid)
+
+ // Convert bytes to UUID format: 8-4-4-4-12 (36 characters with hyphens)
+ // UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+ val hex = bytes.joinToString("") { "%02x".format(it) }
+
+ return buildString {
+ append(hex.substring(0, 8))
+ append('-')
+ append(hex.substring(8, 12))
+ append('-')
+ append(hex.substring(12, 16))
+ append('-')
+ append(hex.substring(16, 20))
+ append('-')
+ append(hex.substring(20, 32))
+ }
+ }
+
+ private fun generateRandomBytes(): ByteArray {
+ val bytes = ByteArray(10)
+ random.nextBytes(bytes)
+ return bytes
+ }
+
+ private fun incrementRandomBytes(bytes: ByteArray): ByteArray {
+ // Increment the random bytes as an unsigned integer
+ // Start from the least significant byte (rightmost)
+ var carry = 1
+ for (i in bytes.indices.reversed()) {
+ val value = (bytes[i].toInt() and 0xFF) + carry
+ bytes[i] = value.toByte()
+ carry = value shr 8
+ if (carry == 0) break
+ }
+ // If carry is still 1, we've overflowed - generate new random bytes
+ if (carry == 1) {
+ random.nextBytes(bytes)
+ }
+ return bytes
+ }
+
+ private fun encodeULID(timestamp: Long, randomBytes: ByteArray): String {
+ val chars = CharArray(26)
+
+ // Encode timestamp (10 characters)
+ var time = timestamp
+ for (i in 9 downTo 0) {
+ chars[i] = ENCODING[(time and 0x1F).toInt()]
+ time = time shr 5
+ }
+
+ // Encode random bytes (16 characters)
+ var randomBits = 0L
+ var bitsRemaining = 0
+ var charIndex = 10
+
+ for (byte in randomBytes) {
+ randomBits = (randomBits shl 8) or (byte.toLong() and 0xFF)
+ bitsRemaining += 8
+
+ while (bitsRemaining >= 5) {
+ bitsRemaining -= 5
+ chars[charIndex++] = ENCODING[((randomBits shr bitsRemaining) and 0x1F).toInt()]
+ }
+ }
+
+ if (bitsRemaining > 0) {
+ chars[charIndex] = ENCODING[((randomBits shl (5 - bitsRemaining)) and 0x1F).toInt()]
+ }
+
+ return String(chars)
+ }
+
+ private fun decodeULID(ulid: String): ByteArray {
+ val bytes = ByteArray(16)
+ var bits = 0L
+ var bitsCount = 0
+ var byteIndex = 0
+
+ for (char in ulid.uppercase()) {
+ val value = DECODING[char.code]
+ require(value >= 0) { "Invalid ULID character: $char" }
+
+ bits = (bits shl 5) or value.toLong()
+ bitsCount += 5
+
+ if (bitsCount >= 8) {
+ bitsCount -= 8
+ bytes[byteIndex++] = ((bits shr bitsCount) and 0xFF).toByte()
+ }
+ }
+
+ return bytes
+ }
+
+ /**
+ * Get generation statistics.
+ *
+ * Provides monitoring information about the generator's operation:
+ * - generatedCount: Total number of ULIDs generated
+ * - monotonicIncrementCount: Number of times monotonic increment was used
+ *
+ * @return Statistics object containing generation metrics
+ */
+ @Synchronized
+ fun getStatistics(): Statistics {
+ return Statistics(generatedCount, monotonicIncrementCount)
+ }
+
+ /**
+ * Reset statistics counters.
+ *
+ * Resets all internal statistics counters to zero. This does not affect the generator's state or ability to generate ULIDs.
+ */
+ @Synchronized
+ fun resetStatistics() {
+ generatedCount = 0L
+ monotonicIncrementCount = 0L
+ }
+
+ /**
+ * Statistics data class for monitoring generator performance.
+ *
+ * @property generatedCount Total number of ULIDs generated since creation or last reset
+ * @property monotonicIncrementCount Number of times monotonic increment was used (same millisecond generation)
+ */
+ data class Statistics(val generatedCount: Long, val monotonicIncrementCount: Long)
+
+ companion object {
+ // Crockford Base32 encoding (excludes I, L, O, U to avoid confusion)
+ private val ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray()
+
+ // Decoding table for Crockford Base32
+ private val DECODING =
+ IntArray(128) { -1 }
+ .apply {
+ for (i in ENCODING.indices) {
+ this[ENCODING[i].code] = i
+ // Support lowercase
+ this[ENCODING[i].lowercaseChar().code] = i
+ }
+ // Handle common confusions
+ this['I'.code] = 1
+ this['i'.code] = 1
+ this['L'.code] = 1
+ this['l'.code] = 1
+ this['O'.code] = 0
+ this['o'.code] = 0
+ }
+ }
+}
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/AbstractThreadLocalHolder.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/AbstractThreadLocalHolder.kt
index 78d53841c..2320166a0 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/AbstractThreadLocalHolder.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/AbstractThreadLocalHolder.kt
@@ -1,7 +1,7 @@
package io.github.truenine.composeserver.holders
import java.io.Closeable
-import java.util.UUID
+import java.util.*
import kotlin.reflect.KClass
import org.springframework.core.NamedInheritableThreadLocal
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/ResourceHolder.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/ResourceHolder.kt
index e8acc7962..ebb2d00a5 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/ResourceHolder.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/ResourceHolder.kt
@@ -10,9 +10,7 @@ import io.github.truenine.composeserver.holders.resolver.ResourceResolver
import io.github.truenine.composeserver.logger
import io.github.truenine.composeserver.properties.DataLoadProperties
import jakarta.annotation.PreDestroy
-import java.util.concurrent.Executors
-import java.util.concurrent.ScheduledExecutorService
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.*
import org.springframework.boot.system.ApplicationHome
import org.springframework.core.env.Environment
import org.springframework.core.io.Resource
diff --git a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfiguration.kt b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfiguration.kt
index 722b54b07..45b58af9d 100644
--- a/shared/src/main/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfiguration.kt
+++ b/shared/src/main/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfiguration.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.holders.config
import io.github.truenine.composeserver.consts.SpringBootConfigurationPropertiesPrefixes
-import jakarta.validation.constraints.Min
-import jakarta.validation.constraints.NotBlank
-import jakarta.validation.constraints.NotEmpty
+import jakarta.validation.constraints.*
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.validation.annotation.Validated
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/AliasExtensionsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/AliasExtensionsTest.kt
index 3856b2e63..58737d491 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/AliasExtensionsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/AliasExtensionsTest.kt
@@ -1,11 +1,6 @@
package io.github.truenine.composeserver
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
-import kotlin.test.fail
+import kotlin.test.*
class AliasExtensionsTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/CollectionExtensionsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/CollectionExtensionsTest.kt
index 846324fe2..0ec755f20 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/CollectionExtensionsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/CollectionExtensionsTest.kt
@@ -2,11 +2,7 @@ package io.github.truenine.composeserver
import io.github.truenine.composeserver.testtoolkit.log
import java.util.concurrent.ConcurrentHashMap
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates collection extension functions defined in CollectionExtensions.kt. */
class CollectionExtensionsTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/DateTimeConverterTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/DateTimeConverterTest.kt
index 4de68a74f..a5416ab1c 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/DateTimeConverterTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/DateTimeConverterTest.kt
@@ -1,11 +1,6 @@
package io.github.truenine.composeserver
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.ZoneId
-import java.time.ZoneOffset
+import java.time.*
import java.util.stream.Stream
import kotlin.test.assertEquals
import org.junit.jupiter.api.Nested
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/IStringTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/IStringTest.kt
index b21174ade..f40460135 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/IStringTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/IStringTest.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates string utility helpers provided by {@link IString}. */
class IStringTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/JavaDateTimeFnsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/JavaDateTimeFnsTest.kt
index 7ccbfd4e2..b1cf67833 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/JavaDateTimeFnsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/JavaDateTimeFnsTest.kt
@@ -1,17 +1,8 @@
package io.github.truenine.composeserver
import io.github.truenine.composeserver.testtoolkit.log
-import java.time.Duration
-import java.time.Instant
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.Period
-import java.time.ZoneId
-import java.time.ZoneOffset
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import java.time.*
+import kotlin.test.*
/** Verifies the date-time extension functions defined in JavaDateTimeFns.kt. */
class JavaDateTimeFnsTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/LoggerExtensionsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/LoggerExtensionsTest.kt
index 1bf4ef322..f8c9a3bb5 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/LoggerExtensionsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/LoggerExtensionsTest.kt
@@ -1,9 +1,6 @@
package io.github.truenine.composeserver
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.slf4j.Logger
/**
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/ResultExtensionsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/ResultExtensionsTest.kt
index 07b7059c7..07aba947a 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/ResultExtensionsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/ResultExtensionsTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/ICacheNamesTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/ICacheNamesTest.kt
index f80372590..d534a90d1 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/ICacheNamesTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/ICacheNamesTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.consts
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates cache name constants declared in {@link ICacheNames}. */
class ICacheNamesTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IHeadersTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IHeadersTest.kt
index 2c9c8d6eb..feded3e54 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IHeadersTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IHeadersTest.kt
@@ -2,9 +2,7 @@ package io.github.truenine.composeserver.consts
import io.github.truenine.composeserver.testtoolkit.log
import java.nio.charset.StandardCharsets
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates HTTP header constants and helper methods defined in {@link IHeaders}. */
class IHeadersTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IInterAddrTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IInterAddrTest.kt
index df64d9648..dd5b93fac 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IInterAddrTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IInterAddrTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.consts
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates network address utilities exposed via {@link IInterAddr}. */
class IInterAddrTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IMethodsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IMethodsTest.kt
index 930f68d51..a9e792f45 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IMethodsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IMethodsTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.consts
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates HTTP method constants declared in {@link IMethods}. */
class IMethodsTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IParameterNamesTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IParameterNamesTest.kt
index b5aabeeca..99fbe1eb6 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IParameterNamesTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IParameterNamesTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.consts
import io.github.truenine.composeserver.testtoolkit.log
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Validates request parameter name constants defined in {@link IParameterNames}. */
class IParameterNamesTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IRegexTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IRegexTest.kt
index fd115fcce..1e0ac0a7d 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IRegexTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/consts/IRegexTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.consts
import java.util.regex.Pattern
-import kotlin.test.Test
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Verifies the regular-expression constants declared in {@link IRegexes}. */
class IRegexTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/IPageParamTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/IPageParamTest.kt
index 77034743d..44184ad0c 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/IPageParamTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/IPageParamTest.kt
@@ -1,17 +1,13 @@
package io.github.truenine.composeserver.domain
-import kotlin.test.AfterTest
-import kotlin.test.BeforeTest
-import kotlin.test.Test
+import kotlin.test.*
import org.assertj.core.api.Assertions.assertThat
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Import
import org.springframework.mock.web.MockHttpServletRequest
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.setup.MockMvcBuilders
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
import tools.jackson.databind.ObjectMapper
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/TestPqController.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/TestPqController.kt
index 1a14c6615..1627ef105 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/TestPqController.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/TestPqController.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.domain
import io.github.truenine.composeserver.Pq
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("v1/pq")
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/EccKeyPairTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/EccKeyPairTest.kt
index 912739c22..ab38eca4f 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/EccKeyPairTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/EccKeyPairTest.kt
@@ -3,13 +3,8 @@ package io.github.truenine.composeserver.domain.enc
import io.github.truenine.composeserver.domain.IEccKeyPair
import io.github.truenine.composeserver.enums.EncryptAlgorithm
import io.github.truenine.composeserver.testtoolkit.log
-import java.security.KeyPairGenerator
-import java.security.PrivateKey
-import java.security.PublicKey
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import java.security.*
+import kotlin.test.*
/** Verifies the core behaviour of {@link EccKeyPair}. */
class EccKeyPairTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/RsaKeyPairTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/RsaKeyPairTest.kt
index 780015ccd..cf67e9c72 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/RsaKeyPairTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/domain/enc/RsaKeyPairTest.kt
@@ -7,10 +7,7 @@ import java.math.BigInteger
import java.security.KeyPairGenerator
import java.security.interfaces.RSAPrivateKey
import java.security.interfaces.RSAPublicKey
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
/** Verifies the core behaviour of {@link RsaKeyPair}. */
class RsaKeyPairTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/enums/MediaTypesTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/enums/MediaTypesTest.kt
index 91892ffc8..56b8d78f1 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/enums/MediaTypesTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/enums/MediaTypesTest.kt
@@ -1,10 +1,6 @@
package io.github.truenine.composeserver.enums
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
class MediaTypesTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/IUUIDGeneratorPropertyTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/IUUIDGeneratorPropertyTest.kt
new file mode 100644
index 000000000..20bb3feee
--- /dev/null
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/IUUIDGeneratorPropertyTest.kt
@@ -0,0 +1,164 @@
+package io.github.truenine.composeserver.generator
+
+import java.util.*
+import kotlin.test.assertTrue
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+/**
+ * Property-based tests for IUUIDGenerator interface.
+ *
+ * These tests verify universal properties that should hold across all implementations and all valid inputs, following the property-based testing methodology.
+ */
+@DisplayName("IUUIDGenerator Property Tests")
+class IUUIDGeneratorPropertyTest {
+
+ /**
+ * **Feature: uuid-generator, Property 1: Timezone-agnostic timestamp consistency** **Validates: Requirements 1.4, 2.4**
+ *
+ * Property: For any system timezone setting, calling currentTimeMillis() should return a timestamp that represents the same absolute point in time (Unix
+ * epoch milliseconds).
+ *
+ * This test verifies that the timestamp is timezone-agnostic by:
+ * 1. Capturing timestamps in different timezone contexts
+ * 2. Verifying they represent the same absolute time
+ * 3. Ensuring the difference is within acceptable tolerance (< 10ms)
+ */
+ @Test
+ fun `property 1 - timezone-agnostic timestamp consistency`() {
+ // Create a test implementation of IUUIDGenerator
+ val generator =
+ object : IUUIDGenerator {
+ override fun nextString(): String = "test-uuid"
+
+ override fun toStandardUUIDFormat(ulid: String): String = "00000000-0000-0000-0000-000000000000"
+ }
+
+ // Store original timezone
+ val originalTimeZone = TimeZone.getDefault()
+
+ try {
+ // Test with multiple timezones (100 iterations as per design spec)
+ val timezones =
+ listOf(
+ "UTC",
+ "America/New_York",
+ "Europe/London",
+ "Asia/Tokyo",
+ "Australia/Sydney",
+ "America/Los_Angeles",
+ "Europe/Paris",
+ "Asia/Shanghai",
+ "America/Chicago",
+ "Pacific/Auckland",
+ )
+
+ val timestamps = mutableListOf()
+
+ // Collect timestamps from different timezone contexts
+ for (i in 0 until 100) {
+ val timezone = timezones[i % timezones.size]
+ TimeZone.setDefault(TimeZone.getTimeZone(timezone))
+
+ val timestamp = generator.currentTimeMillis()
+ timestamps.add(timestamp)
+
+ // Small delay to ensure we're not just getting the same millisecond
+ if (i % 10 == 0) {
+ Thread.sleep(1)
+ }
+ }
+
+ // Verify all timestamps are monotonically increasing or equal
+ // (they should increase over time, but timezone changes shouldn't affect this)
+ for (i in 1 until timestamps.size) {
+ assertTrue(timestamps[i] >= timestamps[i - 1], "Timestamp at index $i (${timestamps[i]}) should be >= previous timestamp (${timestamps[i - 1]})")
+ }
+
+ // Verify timestamps are reasonable (within last year and not in future)
+ val now = System.currentTimeMillis()
+ val oneYearAgo = now - (365L * 24 * 60 * 60 * 1000)
+
+ for ((index, timestamp) in timestamps.withIndex()) {
+ assertTrue(timestamp >= oneYearAgo, "Timestamp at index $index should not be older than one year")
+ assertTrue(timestamp <= now + 1000, "Timestamp at index $index should not be in the future (with 1s tolerance)")
+ }
+
+ // Verify that changing timezone doesn't affect the absolute time value
+ // by checking that timestamps collected in different timezones are consistent
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
+ val utcTimestamp1 = generator.currentTimeMillis()
+
+ TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"))
+ val tokyoTimestamp = generator.currentTimeMillis()
+
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
+ val utcTimestamp2 = generator.currentTimeMillis()
+
+ // The difference between timestamps should be due to execution time, not timezone
+ val timeDiff1 = kotlin.math.abs(tokyoTimestamp - utcTimestamp1)
+ val timeDiff2 = kotlin.math.abs(utcTimestamp2 - tokyoTimestamp)
+
+ // Differences should be small (< 10ms) since they're just execution delays
+ assertTrue(timeDiff1 < 10, "Time difference between UTC and Tokyo should be < 10ms, but was ${timeDiff1}ms")
+ assertTrue(timeDiff2 < 10, "Time difference between Tokyo and UTC should be < 10ms, but was ${timeDiff2}ms")
+ } finally {
+ // Restore original timezone
+ TimeZone.setDefault(originalTimeZone)
+ }
+ }
+
+ /**
+ * Additional test to verify currentTimeMillis() returns Unix epoch time.
+ *
+ * This test ensures that the timestamp is truly timezone-agnostic by verifying it matches System.currentTimeMillis() which always returns UTC epoch time.
+ */
+ @Test
+ fun `currentTimeMillis returns Unix epoch time regardless of timezone`() {
+ val generator =
+ object : IUUIDGenerator {
+ override fun nextString(): String = "test-uuid"
+
+ override fun toStandardUUIDFormat(ulid: String): String = "00000000-0000-0000-0000-000000000000"
+ }
+
+ val originalTimeZone = TimeZone.getDefault()
+
+ try {
+ val timezones = listOf("UTC", "America/New_York", "Asia/Tokyo", "Europe/London", "Australia/Sydney")
+
+ for (timezone in timezones) {
+ TimeZone.setDefault(TimeZone.getTimeZone(timezone))
+
+ val generatorTime = generator.currentTimeMillis()
+ val systemTime = System.currentTimeMillis()
+
+ // The difference should be negligible (< 1ms) since both should return the same epoch time
+ val diff = kotlin.math.abs(generatorTime - systemTime)
+ assertTrue(diff < 1, "In timezone $timezone, generator time should match system time (diff: ${diff}ms)")
+ }
+ } finally {
+ TimeZone.setDefault(originalTimeZone)
+ }
+ }
+
+ /** Test that verifies the default implementation of currentTimeMillis() delegates to System.currentTimeMillis(). */
+ @Test
+ fun `currentTimeMillis default implementation uses System currentTimeMillis`() {
+ val generator =
+ object : IUUIDGenerator {
+ override fun nextString(): String = "test-uuid"
+
+ override fun toStandardUUIDFormat(ulid: String): String = "00000000-0000-0000-0000-000000000000"
+ }
+
+ // Capture timestamps in quick succession
+ val before = System.currentTimeMillis()
+ val generatorTime = generator.currentTimeMillis()
+ val after = System.currentTimeMillis()
+
+ // Generator time should be between before and after
+ assertTrue(generatorTime >= before, "Generator time should be >= time before call")
+ assertTrue(generatorTime <= after, "Generator time should be <= time after call")
+ }
+}
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/OptimizedSnowflakeTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/OptimizedSnowflakeTest.kt
index c91f944cc..435a66fa3 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/OptimizedSnowflakeTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/OptimizedSnowflakeTest.kt
@@ -1,19 +1,11 @@
package io.github.truenine.composeserver.generator
import java.util.*
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.*
import kotlin.math.abs
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
+import kotlin.test.*
+import org.junit.jupiter.api.*
import org.junit.jupiter.api.Test
-import org.junit.jupiter.api.assertAll
-import org.junit.jupiter.api.assertDoesNotThrow
-import org.junit.jupiter.api.assertThrows
class OptimizedSnowflakeTest {
private lateinit var snowflake: SynchronizedSimpleSnowflake
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleOrderCodeGeneratorTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleOrderCodeGeneratorTest.kt
index 913dc6a75..7b9eda6f6 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleOrderCodeGeneratorTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleOrderCodeGeneratorTest.kt
@@ -1,24 +1,12 @@
package io.github.truenine.composeserver.generator
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import java.util.concurrent.ConcurrentHashMap
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
+import io.mockk.*
+import java.util.concurrent.*
import kotlin.math.abs
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertTrue
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.runBlocking
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Nested
+import kotlin.test.*
+import kotlinx.coroutines.*
+import org.junit.jupiter.api.*
import org.junit.jupiter.api.Test
-import org.junit.jupiter.api.TestInstance
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleSnowflakeTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleSnowflakeTest.kt
index f2c8339f0..7827373e9 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleSnowflakeTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/SynchronizedSimpleSnowflakeTest.kt
@@ -1,19 +1,11 @@
package io.github.truenine.composeserver.generator
import java.util.*
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.*
import kotlin.math.abs
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.DisplayName
-import org.junit.jupiter.api.Nested
-import org.junit.jupiter.api.Test
-import org.junit.jupiter.api.assertAll
-import org.junit.jupiter.api.assertDoesNotThrow
-import org.junit.jupiter.api.assertThrows
+import org.junit.jupiter.api.*
@DisplayName("SynchronizedSimpleSnowflake Tests")
class SynchronizedSimpleSnowflakeTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/generator/ULIDGeneratorPropertyTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/ULIDGeneratorPropertyTest.kt
new file mode 100644
index 000000000..9cb3e4748
--- /dev/null
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/generator/ULIDGeneratorPropertyTest.kt
@@ -0,0 +1,806 @@
+package io.github.truenine.composeserver.generator
+
+import java.util.concurrent.*
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+import org.junit.jupiter.api.*
+
+/**
+ * Property-based tests for ULIDGenerator implementation.
+ *
+ * These tests verify universal properties that should hold across all valid inputs and executions. Each test runs multiple iterations to validate properties
+ * across a range of inputs.
+ */
+@DisplayName("ULIDGenerator Property Tests")
+class ULIDGeneratorPropertyTest {
+
+ /**
+ * **Feature: uuid-generator, Property 2: ULID format compliance** **Validates: Requirements 2.3**
+ *
+ * Property: For any generated UUID string, it should conform to ULID format: exactly 26 characters using valid Crockford Base32 encoding (0-9, A-Z excluding
+ * I, L, O, U).
+ *
+ * This test verifies that all generated ULIDs:
+ * 1. Have exactly 26 characters
+ * 2. Only contain valid Crockford Base32 characters
+ * 3. Are case-insensitive (uppercase by default)
+ */
+ @RepeatedTest(100)
+ fun `property 2 - ULID format compliance`() {
+ val generator = ULIDGenerator()
+ val ulid = generator.nextString()
+
+ // Verify length is exactly 26 characters
+ assertEquals(26, ulid.length, "ULID must be exactly 26 characters long")
+
+ // Valid Crockford Base32 characters (excludes I, L, O, U)
+ val validChars = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toSet()
+
+ // Verify all characters are valid
+ for ((index, char) in ulid.withIndex()) {
+ assertTrue(char.uppercaseChar() in validChars, "Character at position $index ('$char') must be valid Crockford Base32 (0-9, A-Z excluding I, L, O, U)")
+ }
+
+ // Verify the ULID is uppercase (standard format)
+ assertTrue(ulid.all { it.isUpperCase() || it.isDigit() }, "ULID should be in uppercase format")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 3: Lexicographic ordering** **Validates: Requirements 3.1**
+ *
+ * Property: For any two UUIDs generated sequentially (UUID1 before UUID2), UUID2 should be lexicographically greater than or equal to UUID1.
+ *
+ * This test verifies that ULIDs maintain lexicographic ordering based on generation time.
+ */
+ @RepeatedTest(100)
+ fun `property 3 - lexicographic ordering`() {
+ val generator = ULIDGenerator()
+
+ // Generate pairs of sequential ULIDs
+ val ulid1 = generator.nextString()
+ // Small delay to ensure different timestamps (optional, but helps test robustness)
+ if (System.nanoTime() % 10 == 0L) {
+ Thread.sleep(1)
+ }
+ val ulid2 = generator.nextString()
+
+ // Verify lexicographic ordering
+ assertTrue(ulid2 >= ulid1, "Later ULID ($ulid2) should be lexicographically >= earlier ULID ($ulid1)")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 4: Timestamp encoding in most significant bits** **Validates: Requirements 3.2**
+ *
+ * Property: For any generated ULID, decoding the first 10 characters should yield a valid timestamp that is close to the generation time (within reasonable
+ * tolerance).
+ *
+ * This test verifies that:
+ * 1. The timestamp is encoded in the first 10 characters
+ * 2. The decoded timestamp matches the generation time
+ * 3. The timestamp is in the most significant bits
+ */
+ @RepeatedTest(100)
+ fun `property 4 - timestamp encoding in most significant bits`() {
+ // Create a generator with known timestamp
+ val testGenerator =
+ object : ULIDGenerator() {
+ var capturedTimestamp: Long = 0
+
+ override fun currentTimeMillis(): Long {
+ capturedTimestamp = super.currentTimeMillis()
+ return capturedTimestamp
+ }
+ }
+
+ val ulid = testGenerator.nextString()
+ val generationTime = testGenerator.capturedTimestamp
+
+ // Decode the first 10 characters (timestamp component)
+ val timestampChars = ulid.substring(0, 10)
+ val decodedTimestamp = decodeTimestamp(timestampChars)
+
+ // Verify the decoded timestamp matches the generation time
+ assertEquals(generationTime, decodedTimestamp, "Decoded timestamp should match generation time")
+
+ // Verify timestamp is reasonable (not in distant past or future)
+ val now = System.currentTimeMillis()
+ assertTrue(decodedTimestamp <= now + 1000, "Decoded timestamp should not be in the future")
+ assertTrue(decodedTimestamp >= now - 60000, "Decoded timestamp should not be more than 1 minute in the past")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 7: Millisecond precision consistency** **Validates: Requirements 3.5**
+ *
+ * Property: For any set of UUIDs generated within the same millisecond, extracting their timestamp components should yield the same millisecond value.
+ *
+ * This test verifies that the timestamp component has millisecond precision.
+ */
+ @Test
+ fun `property 7 - millisecond precision consistency`() {
+ val generator = ULIDGenerator()
+ val ulids = mutableListOf()
+
+ // Generate multiple ULIDs rapidly to increase chance of same-millisecond generation
+ repeat(1000) { ulids.add(generator.nextString()) }
+
+ // Group ULIDs by their timestamp component
+ val timestampGroups = ulids.groupBy { it.substring(0, 10) }
+
+ // For each group with the same timestamp, verify they were generated in the same millisecond
+ for ((timestampChars, groupedUlids) in timestampGroups) {
+ if (groupedUlids.size > 1) {
+ val decodedTimestamp = decodeTimestamp(timestampChars)
+
+ // All ULIDs in this group should have the same timestamp
+ for (ulid in groupedUlids) {
+ val ulidTimestamp = decodeTimestamp(ulid.substring(0, 10))
+ assertEquals(decodedTimestamp, ulidTimestamp, "All ULIDs with same timestamp prefix should decode to same millisecond value")
+ }
+ }
+ }
+
+ // Verify that different timestamp prefixes decode to different milliseconds
+ val uniqueTimestamps = timestampGroups.keys.map { decodeTimestamp(it) }.toSet()
+ assertTrue(uniqueTimestamps.isNotEmpty(), "Should have at least one unique timestamp")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 9: Monotonic increment within same millisecond** **Validates: Requirements 4.2**
+ *
+ * Property: For any sequence of UUIDs generated within the same millisecond in monotonic mode, each UUID should be lexicographically greater than the
+ * previous one.
+ *
+ * This test verifies that monotonic mode ensures increasing ULIDs within the same millisecond.
+ */
+ @Test
+ fun `property 9 - monotonic increment within same millisecond`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+
+ // Generate many ULIDs rapidly to force same-millisecond generation
+ val ulids = mutableListOf()
+ repeat(10000) { ulids.add(generator.nextString()) }
+
+ // Group by timestamp component
+ val timestampGroups = ulids.groupBy { it.substring(0, 10) }
+
+ // Find groups with multiple ULIDs (same millisecond)
+ val sameMillisecondGroups = timestampGroups.filter { it.value.size > 1 }
+
+ assertTrue(sameMillisecondGroups.isNotEmpty(), "Should have at least one group with multiple ULIDs in same millisecond")
+
+ // Verify monotonic ordering within each group
+ for ((timestamp, groupedUlids) in sameMillisecondGroups) {
+ for (i in 1 until groupedUlids.size) {
+ val prev = groupedUlids[i - 1]
+ val curr = groupedUlids[i]
+
+ assertTrue(curr > prev, "In monotonic mode, ULID at index $i ($curr) should be > previous ULID ($prev) within same millisecond ($timestamp)")
+ }
+ }
+ }
+
+ /** Additional test to verify monotonic mode statistics. */
+ @Test
+ fun `monotonic mode increments counter when generating in same millisecond`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+
+ // Generate many ULIDs rapidly
+ repeat(10000) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+
+ // Should have generated 10000 ULIDs
+ assertEquals(10000, stats.generatedCount)
+
+ // Should have some monotonic increments (when same millisecond occurred)
+ assertTrue(stats.monotonicIncrementCount > 0, "Should have at least some monotonic increments when generating rapidly")
+ }
+
+ /** Unit test for statistics tracking: Initial state **Validates: Requirements 4.5** */
+ @Test
+ fun `statistics should start at zero`() {
+ val generator = ULIDGenerator()
+ val stats = generator.getStatistics()
+
+ assertEquals(0L, stats.generatedCount, "Initial generated count should be 0")
+ assertEquals(0L, stats.monotonicIncrementCount, "Initial monotonic increment count should be 0")
+ }
+
+ /** Unit test for statistics tracking: Generation count increment **Validates: Requirements 4.5** */
+ @Test
+ fun `statistics should track generation count correctly`() {
+ val generator = ULIDGenerator()
+
+ // Generate 5 ULIDs
+ repeat(5) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+ assertEquals(5L, stats.generatedCount, "Generated count should be 5 after generating 5 ULIDs")
+
+ // Generate 3 more ULIDs
+ repeat(3) { generator.nextString() }
+
+ val updatedStats = generator.getStatistics()
+ assertEquals(8L, updatedStats.generatedCount, "Generated count should be 8 after generating 8 ULIDs total")
+ }
+
+ /** Unit test for statistics tracking: Monotonic increment counter **Validates: Requirements 4.5** */
+ @Test
+ fun `statistics should track monotonic increment count in monotonic mode`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+
+ // Generate many ULIDs rapidly to force same-millisecond generation
+ repeat(5000) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+
+ assertEquals(5000L, stats.generatedCount, "Generated count should be 5000")
+ assertTrue(stats.monotonicIncrementCount > 0, "Monotonic increment count should be greater than 0 when generating rapidly in monotonic mode")
+ assertTrue(stats.monotonicIncrementCount < stats.generatedCount, "Monotonic increment count should be less than total generated count")
+ }
+
+ /** Unit test for statistics tracking: Non-monotonic mode **Validates: Requirements 4.5** */
+ @Test
+ fun `statistics should not increment monotonic counter in non-monotonic mode`() {
+ val generator = ULIDGenerator(monotonicMode = false)
+
+ // Generate many ULIDs rapidly
+ repeat(5000) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+
+ assertEquals(5000L, stats.generatedCount, "Generated count should be 5000")
+ assertEquals(0L, stats.monotonicIncrementCount, "Monotonic increment count should remain 0 in non-monotonic mode")
+ }
+
+ /** Unit test for statistics reset functionality **Validates: Requirements 4.5** */
+ @Test
+ fun `resetStatistics should reset all counters to zero`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+
+ // Generate some ULIDs
+ repeat(1000) { generator.nextString() }
+
+ val statsBeforeReset = generator.getStatistics()
+ assertTrue(statsBeforeReset.generatedCount > 0, "Generated count should be greater than 0 before reset")
+
+ // Reset statistics
+ generator.resetStatistics()
+
+ val statsAfterReset = generator.getStatistics()
+ assertEquals(0L, statsAfterReset.generatedCount, "Generated count should be 0 after reset")
+ assertEquals(0L, statsAfterReset.monotonicIncrementCount, "Monotonic increment count should be 0 after reset")
+ }
+
+ /** Unit test for statistics reset: Generation continues after reset **Validates: Requirements 4.5** */
+ @Test
+ fun `generator should continue working after statistics reset`() {
+ val generator = ULIDGenerator()
+
+ // Generate some ULIDs
+ repeat(10) { generator.nextString() }
+
+ // Reset statistics
+ generator.resetStatistics()
+
+ // Generate more ULIDs
+ repeat(5) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+ assertEquals(5L, stats.generatedCount, "Generated count should be 5 after reset and generating 5 more ULIDs")
+ }
+
+ /** Unit test for statistics under concurrent access **Validates: Requirements 4.5** */
+ @Test
+ fun `statistics should be accurate under concurrent generation`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+ val threadCount = 10
+ val idsPerThread = 100
+ val totalIds = threadCount * idsPerThread
+
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) { generator.nextString() }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ val stats = generator.getStatistics()
+ assertEquals(totalIds.toLong(), stats.generatedCount, "Generated count should be $totalIds after concurrent generation")
+ }
+
+ /** Unit test for statistics data class properties **Validates: Requirements 4.5** */
+ @Test
+ fun `Statistics data class should have correct properties`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+
+ repeat(100) { generator.nextString() }
+
+ val stats = generator.getStatistics()
+
+ // Verify Statistics is a data class with correct properties
+ assertTrue(stats.generatedCount >= 0, "generatedCount should be non-negative")
+ assertTrue(stats.monotonicIncrementCount >= 0, "monotonicIncrementCount should be non-negative")
+
+ // Verify data class equality
+ val stats2 = ULIDGenerator.Statistics(stats.generatedCount, stats.monotonicIncrementCount)
+ assertEquals(stats, stats2, "Statistics with same values should be equal")
+
+ // Verify toString works (data class feature)
+ val statsString = stats.toString()
+ assertTrue(statsString.contains("generatedCount"), "Statistics toString should contain generatedCount")
+ assertTrue(statsString.contains("monotonicIncrementCount"), "Statistics toString should contain monotonicIncrementCount")
+ }
+
+ /** Unit test for error handling: Invalid ULID string length **Validates: Requirements 4.4** */
+ @Test
+ fun `toStandardUUIDFormat throws exception for invalid ULID length`() {
+ val generator = ULIDGenerator()
+
+ // Test too short
+ val shortUlid = "01AN4Z07BY79KA1307SR9X"
+ val shortException = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat(shortUlid) }
+ assertTrue(shortException.message?.contains("ULID must be 26 characters long") == true, "Exception message should indicate expected length")
+ assertTrue(shortException.message?.contains("but got ${shortUlid.length}") == true, "Exception message should indicate actual length")
+
+ // Test too long
+ val longUlid = "01AN4Z07BY79KA1307SR9X4MV3EXTRA"
+ val longException = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat(longUlid) }
+ assertTrue(longException.message?.contains("ULID must be 26 characters long") == true, "Exception message should indicate expected length")
+ assertTrue(longException.message?.contains("but got ${longUlid.length}") == true, "Exception message should indicate actual length")
+
+ // Test empty string
+ val emptyException = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat("") }
+ assertTrue(
+ emptyException.message?.contains("ULID must be 26 characters long") == true,
+ "Exception message should indicate expected length for empty string",
+ )
+ }
+
+ /** Unit test for error handling: Invalid characters in ULID **Validates: Requirements 4.4** */
+ @Test
+ fun `toStandardUUIDFormat throws exception for invalid characters`() {
+ val generator = ULIDGenerator()
+
+ // Test with invalid character (not in Crockford Base32)
+ val invalidChars =
+ listOf(
+ "01AN4Z07BY79KA1307SR9X4M@3", // @ is invalid
+ "01AN4Z07BY79KA1307SR9X4M#3", // # is invalid
+ "01AN4Z07BY79KA1307SR9X4M$3", // $ is invalid
+ "01AN4Z07BY79KA1307SR9X4M%3", // % is invalid
+ )
+
+ for (invalidUlid in invalidChars) {
+ val exception = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat(invalidUlid) }
+ assertTrue(exception.message?.contains("Invalid ULID character") == true, "Exception message should indicate invalid character for: $invalidUlid")
+ }
+ }
+
+ /** Unit test for error handling: Verify meaningful exception messages **Validates: Requirements 4.4** */
+ @Test
+ fun `error messages are meaningful and helpful`() {
+ val generator = ULIDGenerator()
+
+ // Test length error message
+ val lengthException = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat("SHORT") }
+ assertTrue(lengthException.message?.contains("26 characters") == true, "Length error should mention expected length")
+ assertTrue(lengthException.message?.contains("but got") == true, "Length error should mention actual length")
+
+ // Test invalid character error message
+ val charException = org.junit.jupiter.api.assertThrows { generator.toStandardUUIDFormat("01AN4Z07BY79KA1307SR9X4M@3") }
+ assertTrue(charException.message?.contains("Invalid ULID character") == true, "Character error should mention invalid character")
+ assertTrue(charException.message?.contains("@") == true, "Character error should show the invalid character")
+ }
+
+ /** Unit test to verify case-insensitive decoding works correctly */
+ @Test
+ fun `toStandardUUIDFormat handles case-insensitive input`() {
+ val generator = ULIDGenerator()
+ val ulid = generator.nextString()
+
+ // Convert to lowercase
+ val lowercaseUlid = ulid.lowercase()
+
+ // Both should produce valid UUIDs
+ val uuidFromUppercase = generator.toStandardUUIDFormat(ulid)
+ val uuidFromLowercase = generator.toStandardUUIDFormat(lowercaseUlid)
+
+ // Both should be valid UUID format
+ val hexPattern = Regex("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
+ assertTrue(hexPattern.matches(uuidFromUppercase), "Uppercase ULID should convert to valid UUID")
+ assertTrue(hexPattern.matches(uuidFromLowercase), "Lowercase ULID should convert to valid UUID")
+
+ // They should produce the same UUID
+ assertEquals(uuidFromUppercase, uuidFromLowercase, "Case-insensitive decoding should produce same UUID")
+ }
+
+ /** Unit test to verify common character confusions are handled */
+ @Test
+ fun `toStandardUUIDFormat handles common character confusions`() {
+ val generator = ULIDGenerator()
+
+ // Generate a ULID and replace some characters with confusable ones
+ val ulid = "01AN4Z07BY79KA1307SR9X4MV3"
+
+ // Test I/i -> 1 confusion
+ val ulidWithI = ulid.replace('1', 'I')
+ val uuidWithI = generator.toStandardUUIDFormat(ulidWithI)
+ assertTrue(uuidWithI.matches(Regex("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")), "ULID with 'I' should be decoded as '1'")
+
+ // Test L/l -> 1 confusion
+ val ulidWithL = ulid.replace('1', 'L')
+ val uuidWithL = generator.toStandardUUIDFormat(ulidWithL)
+ assertTrue(uuidWithL.matches(Regex("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")), "ULID with 'L' should be decoded as '1'")
+
+ // Test O/o -> 0 confusion
+ val ulidWithO = ulid.replace('0', 'O')
+ val uuidWithO = generator.toStandardUUIDFormat(ulidWithO)
+ assertTrue(uuidWithO.matches(Regex("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")), "ULID with 'O' should be decoded as '0'")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 5: Standard UUID format conversion** **Validates: Requirements 3.3**
+ *
+ * Property: For any generated ULID string, converting it to standard UUID format should produce a valid 36-character string with hyphens at positions 8, 13,
+ * 18, and 23.
+ *
+ * This test verifies that:
+ * 1. The converted UUID has exactly 36 characters
+ * 2. Hyphens are at the correct positions (8, 13, 18, 23)
+ * 3. All other characters are valid hexadecimal digits
+ * 4. The format matches the standard UUID pattern
+ */
+ @RepeatedTest(100)
+ fun `property 5 - standard UUID format conversion`() {
+ val generator = ULIDGenerator()
+ val ulid = generator.nextString()
+
+ val uuid = generator.toStandardUUIDFormat(ulid)
+
+ // Verify length is exactly 36 characters
+ assertEquals(36, uuid.length, "UUID must be exactly 36 characters long")
+
+ // Verify hyphens are at correct positions
+ assertEquals('-', uuid[8], "Hyphen must be at position 8")
+ assertEquals('-', uuid[13], "Hyphen must be at position 13")
+ assertEquals('-', uuid[18], "Hyphen must be at position 18")
+ assertEquals('-', uuid[23], "Hyphen must be at position 23")
+
+ // Verify all non-hyphen characters are valid hexadecimal
+ val hexPattern = Regex("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
+ assertTrue(hexPattern.matches(uuid), "UUID must match standard format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (lowercase hex)")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 6: Timestamp round-trip consistency** **Validates: Requirements 3.4**
+ *
+ * Property: For any timestamp value, encoding it into a ULID and then extracting the timestamp component should yield the same value (within millisecond
+ * precision).
+ *
+ * This test verifies that:
+ * 1. The timestamp can be extracted from a ULID
+ * 2. The extracted timestamp matches the original timestamp
+ * 3. The round-trip preserves millisecond precision
+ */
+ @RepeatedTest(100)
+ fun `property 6 - timestamp round-trip consistency`() {
+ // Create a generator that captures the timestamp
+ val testGenerator =
+ object : ULIDGenerator() {
+ var capturedTimestamp: Long = 0
+
+ override fun currentTimeMillis(): Long {
+ capturedTimestamp = super.currentTimeMillis()
+ return capturedTimestamp
+ }
+ }
+
+ // Generate ULID and capture timestamp
+ val ulid = testGenerator.nextString()
+ val originalTimestamp = testGenerator.capturedTimestamp
+
+ // Extract timestamp from ULID (first 10 characters)
+ val timestampChars = ulid.substring(0, 10)
+ val extractedTimestamp = decodeTimestamp(timestampChars)
+
+ // Verify round-trip consistency
+ assertEquals(originalTimestamp, extractedTimestamp, "Extracted timestamp should match original timestamp (round-trip consistency)")
+ }
+
+ /**
+ * **Feature: uuid-generator, Property 8: Concurrent uniqueness** **Validates: Requirements 4.1**
+ *
+ * Property: For any concurrent generation of N UUIDs from multiple threads, all N UUIDs should be unique (no duplicates).
+ *
+ * This test verifies that:
+ * 1. ULIDs generated concurrently from multiple threads are all unique
+ * 2. No race conditions cause duplicate IDs
+ * 3. Thread-safe synchronization works correctly
+ */
+ @RepeatedTest(100)
+ fun `property 8 - concurrent uniqueness`() {
+ val generator = ULIDGenerator()
+ val threadCount = 10
+ val idsPerThread = 100
+ val totalIds = threadCount * idsPerThread
+
+ val generatedIds = ConcurrentHashMap.newKeySet()
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ // Generate ULIDs concurrently from multiple threads
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ generatedIds.add(ulid)
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ // Wait for all threads to complete
+ latch.await()
+ executor.shutdown()
+
+ // Verify all ULIDs are unique
+ assertEquals(totalIds, generatedIds.size, "All $totalIds concurrently generated ULIDs should be unique (no duplicates)")
+
+ // Additional verification: all IDs should be valid ULID format
+ for (ulid in generatedIds) {
+ assertEquals(26, ulid.length, "All generated ULIDs should be 26 characters")
+ assertTrue(ulid.all { it.isUpperCase() || it.isDigit() }, "All generated ULIDs should be uppercase")
+ }
+ }
+
+ /** Unit test for thread safety: Concurrent generation from multiple threads **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `concurrent generation from multiple threads produces unique ULIDs`() {
+ val generator = ULIDGenerator()
+ val threadCount = 20
+ val idsPerThread = 500
+ val totalIds = threadCount * idsPerThread
+
+ val generatedIds = ConcurrentHashMap.newKeySet()
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ // Generate ULIDs concurrently
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ val wasNew = generatedIds.add(ulid)
+ assertTrue(wasNew, "Each generated ULID should be unique, but found duplicate: $ulid")
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ assertEquals(totalIds, generatedIds.size, "Should generate exactly $totalIds unique ULIDs from $threadCount threads")
+ }
+
+ /** Unit test for thread safety: No race conditions in state management **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `no race conditions in timestamp and random bytes state management`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+ val threadCount = 15
+ val idsPerThread = 1000
+ val totalIds = threadCount * idsPerThread
+
+ val generatedIds = ConcurrentHashMap.newKeySet()
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ // Generate ULIDs rapidly to stress-test state management
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ generatedIds.add(ulid)
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ // Verify no duplicates (indicates no race conditions)
+ assertEquals(totalIds, generatedIds.size, "No race conditions should occur - all ULIDs should be unique")
+
+ // Verify all ULIDs are valid format
+ for (ulid in generatedIds) {
+ assertEquals(26, ulid.length, "All ULIDs should be 26 characters")
+ val validChars = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toSet()
+ assertTrue(ulid.all { it.uppercaseChar() in validChars }, "All ULIDs should contain only valid Crockford Base32 characters")
+ }
+ }
+
+ /** Unit test for thread safety: Statistics consistency under concurrency **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `statistics remain consistent under concurrent access`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+ val threadCount = 10
+ val idsPerThread = 1000
+ val totalIds = threadCount * idsPerThread
+
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ // Generate ULIDs concurrently
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) { generator.nextString() }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ val stats = generator.getStatistics()
+
+ // Verify generated count is accurate
+ assertEquals(totalIds.toLong(), stats.generatedCount, "Generated count should be exactly $totalIds under concurrent access")
+
+ // Verify monotonic increment count is reasonable
+ assertTrue(stats.monotonicIncrementCount >= 0, "Monotonic increment count should be non-negative")
+ assertTrue(stats.monotonicIncrementCount < stats.generatedCount, "Monotonic increment count should be less than total generated count")
+ }
+
+ /** Unit test for thread safety: Monotonic mode under high concurrency **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `monotonic mode maintains ordering under concurrent access`() {
+ val generator = ULIDGenerator(monotonicMode = true)
+ val threadCount = 10
+ val idsPerThread = 500
+
+ val allUlids = ConcurrentHashMap.newKeySet()
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ allUlids.add(ulid)
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ // Group by timestamp
+ val timestampGroups = allUlids.groupBy { it.substring(0, 10) }
+
+ // Verify monotonic ordering within each timestamp group
+ for ((timestamp, ulids) in timestampGroups) {
+ if (ulids.size > 1) {
+ val sortedUlids = ulids.sorted()
+ // In monotonic mode, ULIDs with same timestamp should be in order
+ // We can't guarantee perfect ordering across threads, but we can verify uniqueness
+ assertEquals(ulids.size, ulids.toSet().size, "All ULIDs with timestamp $timestamp should be unique")
+ }
+ }
+ }
+
+ /** Unit test for thread safety: Secure random mode under concurrency **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `secure random mode works correctly under concurrent access`() {
+ val generator = ULIDGenerator(useSecureRandom = true, monotonicMode = true)
+ val threadCount = 10
+ val idsPerThread = 200
+ val totalIds = threadCount * idsPerThread
+
+ val generatedIds = ConcurrentHashMap.newKeySet()
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ repeat(threadCount) {
+ executor.submit {
+ try {
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ generatedIds.add(ulid)
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ // Verify all ULIDs are unique even with SecureRandom
+ assertEquals(totalIds, generatedIds.size, "SecureRandom mode should produce $totalIds unique ULIDs under concurrent access")
+ }
+
+ /** Unit test for thread safety: Mixed mode operations **Validates: Requirements 2.5, 4.1** */
+ @Test
+ fun `multiple generators can operate concurrently without interference`() {
+ val generator1 = ULIDGenerator(monotonicMode = true)
+ val generator2 = ULIDGenerator(monotonicMode = false)
+ val generator3 = ULIDGenerator(useSecureRandom = true)
+
+ val allIds = ConcurrentHashMap.newKeySet()
+ val threadCount = 15
+ val idsPerThread = 100
+ val executor = Executors.newFixedThreadPool(threadCount)
+ val latch = CountDownLatch(threadCount)
+
+ // Use different generators from different threads
+ repeat(threadCount) { threadIndex ->
+ executor.submit {
+ try {
+ val generator =
+ when (threadIndex % 3) {
+ 0 -> generator1
+ 1 -> generator2
+ else -> generator3
+ }
+ repeat(idsPerThread) {
+ val ulid = generator.nextString()
+ allIds.add(ulid)
+ }
+ } finally {
+ latch.countDown()
+ }
+ }
+ }
+
+ latch.await()
+ executor.shutdown()
+
+ // Verify all IDs are unique across all generators
+ val expectedTotal = threadCount * idsPerThread
+ assertEquals(expectedTotal, allIds.size, "All ULIDs from multiple generators should be unique")
+ }
+
+ /** Helper function to decode timestamp from ULID timestamp component. Decodes the first 10 characters of a ULID to extract the timestamp. */
+ private fun decodeTimestamp(timestampChars: String): Long {
+ require(timestampChars.length == 10) { "Timestamp component must be 10 characters" }
+
+ val encoding = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
+ var timestamp = 0L
+
+ for (char in timestampChars) {
+ val value = encoding.indexOf(char.uppercaseChar())
+ require(value >= 0) { "Invalid character in timestamp: $char" }
+ timestamp = (timestamp shl 5) or value.toLong()
+ }
+
+ return timestamp
+ }
+}
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/ResourceHolderTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/ResourceHolderTest.kt
index 84f009fe4..d89a097ac 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/ResourceHolderTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/ResourceHolderTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.holders
import jakarta.annotation.Resource
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.core.io.ResourceLoader
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfigurationTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfigurationTest.kt
index bcac5479e..264bd5e90 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfigurationTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceHolderConfigurationTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.holders.config
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceSourceTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceSourceTest.kt
index ceffeda7a..deefe2149 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceSourceTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/config/ResourceSourceTest.kt
@@ -3,10 +3,7 @@ package io.github.truenine.composeserver.holders.config
import io.github.truenine.composeserver.holders.exception.InvalidResourceSourceException
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.springframework.core.io.ByteArrayResource
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/fallback/ResourceFallbackHandlerTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/fallback/ResourceFallbackHandlerTest.kt
index 42eb2da75..971de5890 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/fallback/ResourceFallbackHandlerTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/fallback/ResourceFallbackHandlerTest.kt
@@ -1,15 +1,9 @@
package io.github.truenine.composeserver.holders.fallback
-import io.github.truenine.composeserver.holders.config.FallbackConfiguration
-import io.github.truenine.composeserver.holders.config.ResourceSource
-import io.github.truenine.composeserver.holders.config.ResourceType
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import io.github.truenine.composeserver.holders.config.*
+import io.mockk.*
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/monitoring/ResourceHolderMetricsTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/monitoring/ResourceHolderMetricsTest.kt
index b308a43c8..39eeef770 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/monitoring/ResourceHolderMetricsTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/monitoring/ResourceHolderMetricsTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.holders.monitoring
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/optimization/PerformanceOptimizerTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/optimization/PerformanceOptimizerTest.kt
index 2451e10bf..9eeb845ec 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/optimization/PerformanceOptimizerTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/optimization/PerformanceOptimizerTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.holders.optimization
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotEquals
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceCacheTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceCacheTest.kt
index d8cf39099..fd112a6d9 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceCacheTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceCacheTest.kt
@@ -1,11 +1,7 @@
package io.github.truenine.composeserver.holders.resolver
import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.core.io.ByteArrayResource
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceResolverTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceResolverTest.kt
index c74aa0ca1..5b67547b9 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceResolverTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/resolver/ResourceResolverTest.kt
@@ -1,22 +1,14 @@
package io.github.truenine.composeserver.holders.resolver
-import io.github.truenine.composeserver.holders.config.FallbackConfiguration
-import io.github.truenine.composeserver.holders.config.ResourceSource
-import io.github.truenine.composeserver.holders.config.ResourceType
+import io.github.truenine.composeserver.holders.config.*
import io.github.truenine.composeserver.holders.exception.InvalidResourcePatternException
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
+import io.mockk.*
+import kotlin.test.*
import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
-import org.springframework.core.io.ByteArrayResource
-import org.springframework.core.io.Resource
-import org.springframework.core.io.ResourceLoader
+import org.springframework.core.io.*
import org.springframework.core.io.support.PathMatchingResourcePatternResolver
class ResourceResolverTest {
diff --git a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/validation/ResourceValidatorTest.kt b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/validation/ResourceValidatorTest.kt
index dedeee9f0..e7018c679 100644
--- a/shared/src/test/kotlin/io/github/truenine/composeserver/holders/validation/ResourceValidatorTest.kt
+++ b/shared/src/test/kotlin/io/github/truenine/composeserver/holders/validation/ResourceValidatorTest.kt
@@ -4,13 +4,9 @@ import io.github.truenine.composeserver.holders.config.ResourceSource
import io.github.truenine.composeserver.holders.config.ResourceType
import io.github.truenine.composeserver.holders.exception.InvalidResourcePatternException
import io.github.truenine.composeserver.holders.exception.InvalidResourceSourceException
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-import kotlin.test.fail
-import org.junit.jupiter.api.Nested
+import kotlin.test.*
+import org.junit.jupiter.api.*
import org.junit.jupiter.api.Test
-import org.junit.jupiter.api.assertThrows
class ResourceValidatorTest {
diff --git a/sms/sms-tencent/build.gradle.kts b/sms/sms-tencent/build.gradle.kts
index b6988ccff..499c7beae 100644
--- a/sms/sms-tencent/build.gradle.kts
+++ b/sms/sms-tencent/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/sms/sms-tencent/src/test/kotlin/io/github/truenine/composeserver/sms/tencent/TencentSmsTest.kt b/sms/sms-tencent/src/test/kotlin/io/github/truenine/composeserver/sms/tencent/TencentSmsTest.kt
index 8cb114a9b..2bf8c946d 100644
--- a/sms/sms-tencent/src/test/kotlin/io/github/truenine/composeserver/sms/tencent/TencentSmsTest.kt
+++ b/sms/sms-tencent/src/test/kotlin/io/github/truenine/composeserver/sms/tencent/TencentSmsTest.kt
@@ -6,12 +6,7 @@ import com.tencentcloudapi.common.profile.Language
import com.tencentcloudapi.sms.v20210111.SmsClient
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertContains
-import kotlin.test.assertNotEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
class TencentSmsTest {
diff --git a/surveillance/surveillance-hikvision/build.gradle.kts b/surveillance/surveillance-hikvision/build.gradle.kts
index 8f074ec37..ba4f86ebc 100644
--- a/surveillance/surveillance-hikvision/build.gradle.kts
+++ b/surveillance/surveillance-hikvision/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/surveillance/surveillance-shared/build.gradle.kts b/surveillance/surveillance-shared/build.gradle.kts
index 7fb469043..ddba0ac9e 100644
--- a/surveillance/surveillance-shared/build.gradle.kts
+++ b/surveillance/surveillance-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/testtoolkit/AGENTS.md b/testtoolkit/AGENTS.md
deleted file mode 100644
index ad0e7ba89..000000000
--- a/testtoolkit/AGENTS.md
+++ /dev/null
@@ -1,145 +0,0 @@
-# Test Toolkit
-
-Test toolkit providing automatic configuration and utility functions during testing.
-
-## Features
-
-### Auto Configuration
-
-- **Disable Condition Evaluation Report**: Automatically disable Spring Boot's condition evaluation report to reduce test log noise
-- **Disable Banner**: Automatically disable Spring Boot startup banner to simplify test output
-- **Enable Virtual Threads**: Enable JDK virtual threads by default to improve test performance
-- **ANSI Color Output**: Support multiple color output modes (never/detect/always) to enhance log readability
-- **Property Injection**: Support custom test property injection
-- **Early Configuration**: Use ApplicationListener for configuration in early application startup stages
-
-### Utility Functions
-
-- **Logging Utilities**: Provide Kotlin-style logging functions
-- **Spring MVC Utilities**: Provide MVC-related utility functions during testing
-- **Testcontainers Support**: Integrate Testcontainers testing tools
-
-## Usage
-
-### 1. Add Dependencies
-
-Add to your module's `build.gradle.kts`:
-
-```kotlin
-dependencies {
- testImplementation(project(":testtoolkit"))
-}
-```
-
-### 2. Auto Configuration
-
-TestToolkit uses Spring Boot's auto-configuration mechanism, no manual configuration required.
-
-#### Default Configuration
-
-```yaml
-# application-test.yml
-compose:
- testtoolkit:
- enabled: true # Enable test toolkit
- disable-condition-evaluation-report: true # Disable condition evaluation report
- enable-virtual-threads: true # Enable virtual threads
- ansi-output-mode: always # ANSI color output mode
-```
-
-#### Custom Configuration
-
-```yaml
-# application-test.yml
-compose:
- testtoolkit:
- enabled: true
- disable-condition-evaluation-report: false
- enable-virtual-threads: true
- ansi-output-mode: detect # never, detect, always
- additional-properties:
- custom.property.1: "value1"
- custom.property.2: "value2"
-```
-
-### 3. Test Class Example
-
-```kotlin
-@SpringBootTest
-class MyServiceTest {
-
- @Autowired
- private lateinit var myService: MyService
-
- @Test
- fun `test service functionality`() {
- log.trace("testing service functionality")
-
- val result = myService.doSomething()
-
- assertTrue(result.isSuccess, "service call should succeed")
-
- log.debug("service test completed")
- }
-}
-```
-
-### 4. Disable Auto Configuration
-
-To disable auto configuration in specific tests:
-
-```kotlin
-@SpringBootTest
-@TestPropertySource(properties = ["compose.testtoolkit.enabled=false"])
-class MySpecialTest {
- // Test code
-}
-```
-
-## Configuration Properties
-
-| Property Name | Type | Default | Description |
-|-----------------------------------------------------------|---------------------|--------|--------------------------------------------|
-| `compose.testtoolkit.enabled` | Boolean | true | Whether to enable test toolkit |
-| `compose.testtoolkit.disable-condition-evaluation-report` | Boolean | true | Whether to disable condition evaluation report |
-| `compose.testtoolkit.enable-virtual-threads` | Boolean | true | Whether to enable virtual threads |
-| `compose.testtoolkit.ansi-output-mode` | AnsiOutputMode | always | ANSI color output mode (never/detect/always) |
-| `compose.testtoolkit.additional-properties` | Map | {} | Additional test properties |
-
-## Provided Beans
-
-- **TestConfigurationBean**: Main configuration bean
-- **TestEnvironmentPostProcessor**: Test environment post-processor
-
-## Utility Functions
-
-### Logging Functions
-
-```kotlin
-// Get logger instance
-val log = this.log
-
-// Print variable values directly
-log.info(::variableName)
-```
-
-### Type Aliases
-
-```kotlin
-typealias SysLogger = org.slf4j.Logger
-typealias RDBRollback = Rollback
-typealias TempDirMapping = TempDir
-```
-
-## Best Practices
-
-1. **Test Method Naming**: Use Chinese naming for test methods to describe test scenarios
-2. **Logging**: Log at the beginning and end of test methods for debugging
-3. **Property Configuration**: Place test-related configurations in `application-test.yml`
-4. **Environment Isolation**: Use profiles to distinguish different test environments
-
-## Notes
-
-- Auto configuration only takes effect in test environments
-- Color output requires terminal ANSI color support
-- Disabling condition evaluation report may affect debugging, enable as needed
\ No newline at end of file
diff --git a/testtoolkit/CLAUDE.md b/testtoolkit/CLAUDE.md
deleted file mode 100644
index ad0e7ba89..000000000
--- a/testtoolkit/CLAUDE.md
+++ /dev/null
@@ -1,145 +0,0 @@
-# Test Toolkit
-
-Test toolkit providing automatic configuration and utility functions during testing.
-
-## Features
-
-### Auto Configuration
-
-- **Disable Condition Evaluation Report**: Automatically disable Spring Boot's condition evaluation report to reduce test log noise
-- **Disable Banner**: Automatically disable Spring Boot startup banner to simplify test output
-- **Enable Virtual Threads**: Enable JDK virtual threads by default to improve test performance
-- **ANSI Color Output**: Support multiple color output modes (never/detect/always) to enhance log readability
-- **Property Injection**: Support custom test property injection
-- **Early Configuration**: Use ApplicationListener for configuration in early application startup stages
-
-### Utility Functions
-
-- **Logging Utilities**: Provide Kotlin-style logging functions
-- **Spring MVC Utilities**: Provide MVC-related utility functions during testing
-- **Testcontainers Support**: Integrate Testcontainers testing tools
-
-## Usage
-
-### 1. Add Dependencies
-
-Add to your module's `build.gradle.kts`:
-
-```kotlin
-dependencies {
- testImplementation(project(":testtoolkit"))
-}
-```
-
-### 2. Auto Configuration
-
-TestToolkit uses Spring Boot's auto-configuration mechanism, no manual configuration required.
-
-#### Default Configuration
-
-```yaml
-# application-test.yml
-compose:
- testtoolkit:
- enabled: true # Enable test toolkit
- disable-condition-evaluation-report: true # Disable condition evaluation report
- enable-virtual-threads: true # Enable virtual threads
- ansi-output-mode: always # ANSI color output mode
-```
-
-#### Custom Configuration
-
-```yaml
-# application-test.yml
-compose:
- testtoolkit:
- enabled: true
- disable-condition-evaluation-report: false
- enable-virtual-threads: true
- ansi-output-mode: detect # never, detect, always
- additional-properties:
- custom.property.1: "value1"
- custom.property.2: "value2"
-```
-
-### 3. Test Class Example
-
-```kotlin
-@SpringBootTest
-class MyServiceTest {
-
- @Autowired
- private lateinit var myService: MyService
-
- @Test
- fun `test service functionality`() {
- log.trace("testing service functionality")
-
- val result = myService.doSomething()
-
- assertTrue(result.isSuccess, "service call should succeed")
-
- log.debug("service test completed")
- }
-}
-```
-
-### 4. Disable Auto Configuration
-
-To disable auto configuration in specific tests:
-
-```kotlin
-@SpringBootTest
-@TestPropertySource(properties = ["compose.testtoolkit.enabled=false"])
-class MySpecialTest {
- // Test code
-}
-```
-
-## Configuration Properties
-
-| Property Name | Type | Default | Description |
-|-----------------------------------------------------------|---------------------|--------|--------------------------------------------|
-| `compose.testtoolkit.enabled` | Boolean | true | Whether to enable test toolkit |
-| `compose.testtoolkit.disable-condition-evaluation-report` | Boolean | true | Whether to disable condition evaluation report |
-| `compose.testtoolkit.enable-virtual-threads` | Boolean | true | Whether to enable virtual threads |
-| `compose.testtoolkit.ansi-output-mode` | AnsiOutputMode | always | ANSI color output mode (never/detect/always) |
-| `compose.testtoolkit.additional-properties` | Map | {} | Additional test properties |
-
-## Provided Beans
-
-- **TestConfigurationBean**: Main configuration bean
-- **TestEnvironmentPostProcessor**: Test environment post-processor
-
-## Utility Functions
-
-### Logging Functions
-
-```kotlin
-// Get logger instance
-val log = this.log
-
-// Print variable values directly
-log.info(::variableName)
-```
-
-### Type Aliases
-
-```kotlin
-typealias SysLogger = org.slf4j.Logger
-typealias RDBRollback = Rollback
-typealias TempDirMapping = TempDir
-```
-
-## Best Practices
-
-1. **Test Method Naming**: Use Chinese naming for test methods to describe test scenarios
-2. **Logging**: Log at the beginning and end of test methods for debugging
-3. **Property Configuration**: Place test-related configurations in `application-test.yml`
-4. **Environment Isolation**: Use profiles to distinguish different test environments
-
-## Notes
-
-- Auto configuration only takes effect in test environments
-- Color output requires terminal ANSI color support
-- Disabling condition evaluation report may affect debugging, enable as needed
\ No newline at end of file
diff --git a/testtoolkit/testtoolkit-shared/build.gradle.kts b/testtoolkit/testtoolkit-shared/build.gradle.kts
index 2a8514025..6b84b39e0 100644
--- a/testtoolkit/testtoolkit-shared/build.gradle.kts
+++ b/testtoolkit/testtoolkit-shared/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/testtoolkit/testtoolkit-shared/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/KotlinTestExtensions.kt b/testtoolkit/testtoolkit-shared/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/KotlinTestExtensions.kt
index 540f4c193..09ceceec8 100644
--- a/testtoolkit/testtoolkit-shared/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/KotlinTestExtensions.kt
+++ b/testtoolkit/testtoolkit-shared/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/KotlinTestExtensions.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.testtoolkit
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
fun assertNotEmpty(message: String? = "collection is empty", actual: () -> List) {
assertNotEquals(0, actual().size, message)
diff --git a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/AliasTest.kt b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/AliasTest.kt
index 1bb87d28a..c4fc965e6 100644
--- a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/AliasTest.kt
+++ b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/AliasTest.kt
@@ -1,10 +1,7 @@
package io.github.truenine.composeserver.testtoolkit
import java.nio.file.Path
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.io.TempDir
import org.slf4j.LoggerFactory
import org.springframework.test.annotation.Rollback
diff --git a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/LoggerExtensionsTest.kt b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/LoggerExtensionsTest.kt
index be38e3e09..f023c0d89 100644
--- a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/LoggerExtensionsTest.kt
+++ b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/LoggerExtensionsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.testtoolkit
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
+import kotlin.test.*
import org.slf4j.LoggerFactory
/**
diff --git a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/SpringMvcExtensionsTest.kt b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/SpringMvcExtensionsTest.kt
index 42b4a4100..8c3a3b6ca 100644
--- a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/SpringMvcExtensionsTest.kt
+++ b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/SpringMvcExtensionsTest.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.testtoolkit
-import kotlin.test.Test
-import kotlin.test.assertContentEquals
-import kotlin.test.assertEquals
+import kotlin.test.*
import org.springframework.mock.web.MockMultipartFile
/**
diff --git a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/TestRetryUtilsTest.kt b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/TestRetryUtilsTest.kt
index b6e59036b..2e8c046ac 100644
--- a/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/TestRetryUtilsTest.kt
+++ b/testtoolkit/testtoolkit-shared/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/TestRetryUtilsTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.testtoolkit.utils
import java.time.Duration
import java.util.concurrent.atomic.AtomicInteger
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertTrue
+import kotlin.test.*
/**
* TestRetryUtils test suite.
diff --git a/testtoolkit/testtoolkit-springmvc/build.gradle.kts b/testtoolkit/testtoolkit-springmvc/build.gradle.kts
index 570256976..79cc28f43 100644
--- a/testtoolkit/testtoolkit-springmvc/build.gradle.kts
+++ b/testtoolkit/testtoolkit-springmvc/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/testtoolkit/testtoolkit-testcontainers/build.gradle.kts b/testtoolkit/testtoolkit-testcontainers/build.gradle.kts
index 1c4a6e5a1..b512ee8a2 100644
--- a/testtoolkit/testtoolkit-testcontainers/build.gradle.kts
+++ b/testtoolkit/testtoolkit-testcontainers/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("buildlogic.kotlinspring-conventions")
+ id("buildlogic.kotlin-spring-boot-conventions")
id("buildlogic.spotless-conventions")
}
diff --git a/testtoolkit/testtoolkit-testcontainers/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ITestContainerBase.kt b/testtoolkit/testtoolkit-testcontainers/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ITestContainerBase.kt
index b3fef8cd4..197c8711c 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ITestContainerBase.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/main/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ITestContainerBase.kt
@@ -1,8 +1,6 @@
package io.github.truenine.composeserver.testtoolkit.testcontainers
-import org.testcontainers.containers.GenericContainer
-import org.testcontainers.containers.MySQLContainer
-import org.testcontainers.containers.PostgreSQLContainer
+import org.testcontainers.containers.*
/**
* Base interface for test containers.
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/TestcontainersVerificationTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/TestcontainersVerificationTest.kt
index 855c34770..a6c46d616 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/TestcontainersVerificationTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/TestcontainersVerificationTest.kt
@@ -1,26 +1,17 @@
package io.github.truenine.composeserver.testtoolkit
-import io.github.truenine.composeserver.testtoolkit.utils.TestRetryUtils
-import io.github.truenine.composeserver.testtoolkit.utils.execAndCheckOutput
-import io.github.truenine.composeserver.testtoolkit.utils.fileExists
-import io.github.truenine.composeserver.testtoolkit.utils.readFile
-import io.github.truenine.composeserver.testtoolkit.utils.startAndWaitForReady
-import io.github.truenine.composeserver.testtoolkit.utils.waitForFile
+import io.github.truenine.composeserver.testtoolkit.utils.*
import java.time.Duration
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.io.path.createTempFile
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.*
import kotlinx.coroutines.selects.select
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertTimeout
-import org.testcontainers.containers.GenericContainer
-import org.testcontainers.containers.MySQLContainer
-import org.testcontainers.containers.PostgreSQLContainer
+import org.testcontainers.containers.*
import org.testcontainers.containers.output.Slf4jLogConsumer
import org.testcontainers.utility.MountableFile
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestConfigurationBeanTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestConfigurationBeanTest.kt
index 345625ce7..73b700c00 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestConfigurationBeanTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestConfigurationBeanTest.kt
@@ -1,20 +1,11 @@
package io.github.truenine.composeserver.testtoolkit.autoconfig
-import io.github.truenine.composeserver.testtoolkit.properties.AnsiOutputMode
-import io.github.truenine.composeserver.testtoolkit.properties.TestConfigurationProperties
-import io.github.truenine.composeserver.testtoolkit.properties.TestcontainersProperties
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import io.github.truenine.composeserver.testtoolkit.properties.*
+import io.mockk.*
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
-import org.springframework.core.env.ConfigurableEnvironment
-import org.springframework.core.env.MapPropertySource
-import org.springframework.core.env.MutablePropertySources
+import org.springframework.core.env.*
class TestConfigurationBeanTest {
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestEnvironmentApplicationListenerTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestEnvironmentApplicationListenerTest.kt
index e6a90ba30..a62781619 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestEnvironmentApplicationListenerTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestEnvironmentApplicationListenerTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.testtoolkit.autoconfig
import io.github.truenine.composeserver.testtoolkit.log
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
+import io.mockk.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
@@ -11,9 +9,7 @@ import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent
-import org.springframework.core.env.ConfigurableEnvironment
-import org.springframework.core.env.MapPropertySource
-import org.springframework.core.env.MutablePropertySources
+import org.springframework.core.env.*
class TestEnvironmentApplicationListenerTest {
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestcontainersPropertiesTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestcontainersPropertiesTest.kt
index 424ebb952..ac193dc47 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestcontainersPropertiesTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/autoconfig/TestcontainersPropertiesTest.kt
@@ -1,10 +1,6 @@
package io.github.truenine.composeserver.testtoolkit.autoconfig
-import io.github.truenine.composeserver.testtoolkit.properties.MinioConfig
-import io.github.truenine.composeserver.testtoolkit.properties.MysqlConfig
-import io.github.truenine.composeserver.testtoolkit.properties.PostgresConfig
-import io.github.truenine.composeserver.testtoolkit.properties.RedisConfig
-import io.github.truenine.composeserver.testtoolkit.properties.TestcontainersProperties
+import io.github.truenine.composeserver.testtoolkit.properties.*
import kotlin.test.assertEquals
import org.junit.jupiter.api.Test
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ContainersIntegrationTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ContainersIntegrationTest.kt
index fc861dc9f..6f31e3105 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ContainersIntegrationTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ContainersIntegrationTest.kt
@@ -1,13 +1,9 @@
package io.github.truenine.composeserver.testtoolkit.testcontainers
import io.github.truenine.composeserver.testtoolkit.log
-import io.minio.BucketExistsArgs
-import io.minio.MakeBucketArgs
-import io.minio.MinioClient
+import io.minio.*
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ExtensionFunctionsTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ExtensionFunctionsTest.kt
index c79158725..f9640f09b 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ExtensionFunctionsTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ExtensionFunctionsTest.kt
@@ -1,9 +1,7 @@
package io.github.truenine.composeserver.testtoolkit.testcontainers
import jakarta.annotation.Resource
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ICacheRedisContainerTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ICacheRedisContainerTest.kt
index 3b35acce8..e44cde288 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ICacheRedisContainerTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/ICacheRedisContainerTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.testtoolkit.testcontainers
import jakarta.annotation.Resource
import java.time.Duration
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.test.context.SpringBootTest
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabaseMysqlContainerTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabaseMysqlContainerTest.kt
index 098b2e27a..1f952bf8c 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabaseMysqlContainerTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabaseMysqlContainerTest.kt
@@ -3,10 +3,7 @@ package io.github.truenine.composeserver.testtoolkit.testcontainers
import jakarta.annotation.Resource
import java.sql.DriverManager
import java.sql.SQLException
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.core.env.Environment
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabasePostgresqlContainerTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabasePostgresqlContainerTest.kt
index d6291e89e..f9e758704 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabasePostgresqlContainerTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IDatabasePostgresqlContainerTest.kt
@@ -3,10 +3,7 @@ package io.github.truenine.composeserver.testtoolkit.testcontainers
import jakarta.annotation.Resource
import java.sql.DriverManager
import java.sql.SQLException
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.core.env.Environment
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IOssMinioContainerTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IOssMinioContainerTest.kt
index b69e94be2..b753248ac 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IOssMinioContainerTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/IOssMinioContainerTest.kt
@@ -5,10 +5,7 @@ import jakarta.annotation.Resource
import java.net.InetSocketAddress
import java.net.Socket
import java.util.function.Supplier
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/TestcontainersConfigurationHolderTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/TestcontainersConfigurationHolderTest.kt
index cc07dce8b..2900494a6 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/TestcontainersConfigurationHolderTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/testcontainers/TestcontainersConfigurationHolderTest.kt
@@ -3,9 +3,7 @@ package io.github.truenine.composeserver.testtoolkit.testcontainers
import io.github.truenine.composeserver.testtoolkit.properties.TestcontainersProperties
import io.mockk.every
import io.mockk.mockk
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.context.ApplicationContext
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerCommandExecutorTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerCommandExecutorTest.kt
index 0775bd16c..34f1570d1 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerCommandExecutorTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerCommandExecutorTest.kt
@@ -2,12 +2,7 @@ package io.github.truenine.composeserver.testtoolkit.utils
import io.github.truenine.composeserver.testtoolkit.log
import java.time.Duration
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-import kotlin.test.assertFalse
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.testcontainers.containers.GenericContainer
import org.testcontainers.utility.DockerImageName
diff --git a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerExtensionsTest.kt b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerExtensionsTest.kt
index d3013f853..f0640fd71 100644
--- a/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerExtensionsTest.kt
+++ b/testtoolkit/testtoolkit-testcontainers/src/test/kotlin/io/github/truenine/composeserver/testtoolkit/utils/ContainerExtensionsTest.kt
@@ -2,10 +2,7 @@ package io.github.truenine.composeserver.testtoolkit.utils
import io.github.truenine.composeserver.testtoolkit.log
import java.time.Duration
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
+import kotlin.test.*
import org.testcontainers.containers.GenericContainer
import org.testcontainers.utility.DockerImageName
diff --git a/version-catalog/build.gradle.kts b/version-catalog/build.gradle.kts
index b8e082fbc..94041a789 100644
--- a/version-catalog/build.gradle.kts
+++ b/version-catalog/build.gradle.kts
@@ -6,7 +6,7 @@ plugins {
alias(libs.plugins.com.github.ben.manes.versions)
`version-catalog`
java
- id("buildlogic.publish-conventions")
+ id("buildlogic.maven-publish-conventions")
}
repositories {