mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 02:34:39 +00:00
refactor: Replace Injekt with Koin (Experiment) (#191)
* refactor: Use Koin An experiment, aims to ditch Injekt and replace it with Koin while providing Injekt API facade for extensions * fix: Mimic "InjektScope" * fix: Mimic more classes Completely fixed source search * refactor(deps): Use Injekt-Koin library * fix(r8): Keep Koin
This commit is contained in:
parent
bc65f17f60
commit
9d858cc810
8 changed files with 182 additions and 192 deletions
1
app/proguard-rules.pro
vendored
1
app/proguard-rules.pro
vendored
|
@ -17,6 +17,7 @@
|
||||||
-keep,allowoptimization class com.google.gson.** { public protected *; }
|
-keep,allowoptimization class com.google.gson.** { public protected *; }
|
||||||
-keep,allowoptimization class app.cash.quickjs.** { public protected *; }
|
-keep,allowoptimization class app.cash.quickjs.** { public protected *; }
|
||||||
-keep,allowoptimization class uy.kohesive.injekt.** { public protected *; }
|
-keep,allowoptimization class uy.kohesive.injekt.** { public protected *; }
|
||||||
|
-keep,allowoptimization class org.koin.** { public protected *; }
|
||||||
-keep,allowoptimization class eu.davidea.flexibleadapter.** { public protected *; }
|
-keep,allowoptimization class eu.davidea.flexibleadapter.** { public protected *; }
|
||||||
-keep class io.requery.android.database.** { public protected *; }
|
-keep class io.requery.android.database.** { public protected *; }
|
||||||
|
|
||||||
|
|
|
@ -59,13 +59,14 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import org.conscrypt.Conscrypt
|
import org.conscrypt.Conscrypt
|
||||||
|
import org.koin.core.context.startKoin
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import yokai.core.CrashlyticsLogWriter
|
import yokai.core.CrashlyticsLogWriter
|
||||||
import yokai.core.di.AppModule
|
import yokai.core.di.appModule
|
||||||
import yokai.core.di.DomainModule
|
import yokai.core.di.domainModule
|
||||||
import yokai.core.di.PreferenceModule
|
import yokai.core.di.preferenceModule
|
||||||
import yokai.core.migration.Migrator
|
import yokai.core.migration.Migrator
|
||||||
import yokai.core.migration.migrations.migrations
|
import yokai.core.migration.migrations.migrations
|
||||||
import yokai.domain.base.BasePreferences
|
import yokai.domain.base.BasePreferences
|
||||||
|
@ -97,10 +98,8 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
|
||||||
if (packageName != process) WebView.setDataDirectorySuffix(process)
|
if (packageName != process) WebView.setDataDirectorySuffix(process)
|
||||||
}
|
}
|
||||||
|
|
||||||
Injekt.apply {
|
startKoin {
|
||||||
importModule(PreferenceModule(this@App))
|
modules(preferenceModule(this@App), appModule(this@App), domainModule())
|
||||||
importModule(AppModule(this@App))
|
|
||||||
importModule(DomainModule())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
basePreferences.crashReport().changes()
|
basePreferences.crashReport().changes()
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package yokai.core.di
|
package yokai.core.di
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.sqlite.db.SupportSQLiteOpenHelper
|
import androidx.sqlite.db.SupportSQLiteOpenHelper
|
||||||
import app.cash.sqldelight.db.SqlDriver
|
import app.cash.sqldelight.db.SqlDriver
|
||||||
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
|
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
|
||||||
|
@ -27,23 +26,19 @@ import kotlinx.serialization.json.Json
|
||||||
import nl.adaptivity.xmlutil.XmlDeclMode
|
import nl.adaptivity.xmlutil.XmlDeclMode
|
||||||
import nl.adaptivity.xmlutil.core.XmlVersion
|
import nl.adaptivity.xmlutil.core.XmlVersion
|
||||||
import nl.adaptivity.xmlutil.serialization.XML
|
import nl.adaptivity.xmlutil.serialization.XML
|
||||||
import uy.kohesive.injekt.api.InjektModule
|
import org.koin.core.module.dsl.createdAtStart
|
||||||
import uy.kohesive.injekt.api.InjektRegistrar
|
import org.koin.core.module.dsl.withOptions
|
||||||
import uy.kohesive.injekt.api.addSingleton
|
import org.koin.dsl.module
|
||||||
import uy.kohesive.injekt.api.addSingletonFactory
|
|
||||||
import uy.kohesive.injekt.api.get
|
|
||||||
import yokai.data.AndroidDatabaseHandler
|
import yokai.data.AndroidDatabaseHandler
|
||||||
import yokai.data.Database
|
import yokai.data.Database
|
||||||
import yokai.data.DatabaseHandler
|
import yokai.data.DatabaseHandler
|
||||||
import yokai.domain.SplashState
|
import yokai.domain.SplashState
|
||||||
import yokai.domain.storage.StorageManager
|
import yokai.domain.storage.StorageManager
|
||||||
|
|
||||||
class AppModule(val app: Application) : InjektModule {
|
fun appModule(app: Application) = module {
|
||||||
|
single { app }
|
||||||
|
|
||||||
override fun InjektRegistrar.registerInjectables() {
|
single<SupportSQLiteOpenHelper> {
|
||||||
addSingleton(app)
|
|
||||||
|
|
||||||
addSingletonFactory<SupportSQLiteOpenHelper> {
|
|
||||||
val configuration = SupportSQLiteOpenHelper.Configuration.builder(app)
|
val configuration = SupportSQLiteOpenHelper.Configuration.builder(app)
|
||||||
.callback(DbOpenCallback())
|
.callback(DbOpenCallback())
|
||||||
.name(DbOpenCallback.DATABASE_NAME)
|
.name(DbOpenCallback.DATABASE_NAME)
|
||||||
|
@ -61,7 +56,7 @@ class AppModule(val app: Application) : InjektModule {
|
||||||
RequerySQLiteOpenHelperFactory().create(configuration)
|
RequerySQLiteOpenHelperFactory().create(configuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
addSingletonFactory<SqlDriver> {
|
single<SqlDriver> {
|
||||||
AndroidSqliteDriver(openHelper = get())
|
AndroidSqliteDriver(openHelper = get())
|
||||||
/*
|
/*
|
||||||
AndroidSqliteDriver(
|
AndroidSqliteDriver(
|
||||||
|
@ -78,20 +73,26 @@ class AppModule(val app: Application) : InjektModule {
|
||||||
)
|
)
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
addSingletonFactory {
|
|
||||||
|
single {
|
||||||
Database(
|
Database(
|
||||||
driver = get(),
|
driver = get(),
|
||||||
)
|
)
|
||||||
|
} withOptions {
|
||||||
|
createdAtStart()
|
||||||
}
|
}
|
||||||
addSingletonFactory<DatabaseHandler> { AndroidDatabaseHandler(get(), get()) }
|
|
||||||
|
|
||||||
addSingletonFactory { DatabaseHelper(app, get()) }
|
single<DatabaseHandler> { AndroidDatabaseHandler(get(), get()) }
|
||||||
|
|
||||||
addSingletonFactory { ChapterCache(app) }
|
single { DatabaseHelper(app, get()) } withOptions {
|
||||||
|
createdAtStart()
|
||||||
|
}
|
||||||
|
|
||||||
addSingletonFactory { CoverCache(app) }
|
single { ChapterCache(app) }
|
||||||
|
|
||||||
addSingletonFactory {
|
single { CoverCache(app) }
|
||||||
|
|
||||||
|
single {
|
||||||
NetworkHelper(
|
NetworkHelper(
|
||||||
app,
|
app,
|
||||||
get(),
|
get(),
|
||||||
|
@ -107,26 +108,34 @@ class AppModule(val app: Application) : InjektModule {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} withOptions {
|
||||||
|
createdAtStart()
|
||||||
}
|
}
|
||||||
|
|
||||||
addSingletonFactory { JavaScriptEngine(app) }
|
single { JavaScriptEngine(app) }
|
||||||
|
|
||||||
addSingletonFactory { SourceManager(app, get()) }
|
single { SourceManager(app, get()) } withOptions {
|
||||||
addSingletonFactory { ExtensionManager(app) }
|
createdAtStart()
|
||||||
|
}
|
||||||
|
single { ExtensionManager(app) }
|
||||||
|
|
||||||
addSingletonFactory { DownloadManager(app) }
|
single { DownloadManager(app) } withOptions {
|
||||||
|
createdAtStart()
|
||||||
|
}
|
||||||
|
|
||||||
addSingletonFactory { CustomMangaManager(app) }
|
single { CustomMangaManager(app) } withOptions {
|
||||||
|
createdAtStart()
|
||||||
|
}
|
||||||
|
|
||||||
addSingletonFactory { TrackManager(app) }
|
single { TrackManager(app) }
|
||||||
|
|
||||||
addSingletonFactory {
|
single {
|
||||||
Json {
|
Json {
|
||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
explicitNulls = false
|
explicitNulls = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addSingletonFactory {
|
single {
|
||||||
XML {
|
XML {
|
||||||
defaultPolicy {
|
defaultPolicy {
|
||||||
ignoreUnknownChildren()
|
ignoreUnknownChildren()
|
||||||
|
@ -138,28 +147,12 @@ class AppModule(val app: Application) : InjektModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addSingletonFactory { ChapterFilter() }
|
single { ChapterFilter() }
|
||||||
|
|
||||||
addSingletonFactory { MangaShortcutManager() }
|
single { MangaShortcutManager() }
|
||||||
|
|
||||||
addSingletonFactory { AndroidStorageFolderProvider(app) }
|
single { AndroidStorageFolderProvider(app) }
|
||||||
addSingletonFactory { StorageManager(app, get()) }
|
single { StorageManager(app, get()) }
|
||||||
|
|
||||||
addSingletonFactory { SplashState() }
|
single { SplashState() }
|
||||||
|
|
||||||
// Asynchronously init expensive components for a faster cold start
|
|
||||||
ContextCompat.getMainExecutor(app).execute {
|
|
||||||
get<NetworkHelper>()
|
|
||||||
|
|
||||||
get<SourceManager>()
|
|
||||||
|
|
||||||
get<Database>()
|
|
||||||
|
|
||||||
get<DatabaseHelper>()
|
|
||||||
|
|
||||||
get<DownloadManager>()
|
|
||||||
|
|
||||||
get<CustomMangaManager>()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
package yokai.core.di
|
package yokai.core.di
|
||||||
|
|
||||||
import uy.kohesive.injekt.api.InjektModule
|
import org.koin.dsl.module
|
||||||
import uy.kohesive.injekt.api.InjektRegistrar
|
|
||||||
import uy.kohesive.injekt.api.addFactory
|
|
||||||
import uy.kohesive.injekt.api.addSingletonFactory
|
|
||||||
import uy.kohesive.injekt.api.get
|
|
||||||
import yokai.data.category.CategoryRepositoryImpl
|
import yokai.data.category.CategoryRepositoryImpl
|
||||||
import yokai.data.chapter.ChapterRepositoryImpl
|
import yokai.data.chapter.ChapterRepositoryImpl
|
||||||
import yokai.data.extension.repo.ExtensionRepoRepositoryImpl
|
import yokai.data.extension.repo.ExtensionRepoRepositoryImpl
|
||||||
|
@ -18,7 +14,6 @@ import yokai.domain.chapter.interactor.DeleteChapter
|
||||||
import yokai.domain.chapter.interactor.GetAvailableScanlators
|
import yokai.domain.chapter.interactor.GetAvailableScanlators
|
||||||
import yokai.domain.chapter.interactor.GetChapter
|
import yokai.domain.chapter.interactor.GetChapter
|
||||||
import yokai.domain.chapter.interactor.InsertChapter
|
import yokai.domain.chapter.interactor.InsertChapter
|
||||||
import yokai.domain.recents.interactor.GetRecents
|
|
||||||
import yokai.domain.chapter.interactor.UpdateChapter
|
import yokai.domain.chapter.interactor.UpdateChapter
|
||||||
import yokai.domain.extension.interactor.TrustExtension
|
import yokai.domain.extension.interactor.TrustExtension
|
||||||
import yokai.domain.extension.repo.ExtensionRepoRepository
|
import yokai.domain.extension.repo.ExtensionRepoRepository
|
||||||
|
@ -39,43 +34,42 @@ import yokai.domain.manga.interactor.GetLibraryManga
|
||||||
import yokai.domain.manga.interactor.GetManga
|
import yokai.domain.manga.interactor.GetManga
|
||||||
import yokai.domain.manga.interactor.InsertManga
|
import yokai.domain.manga.interactor.InsertManga
|
||||||
import yokai.domain.manga.interactor.UpdateManga
|
import yokai.domain.manga.interactor.UpdateManga
|
||||||
|
import yokai.domain.recents.interactor.GetRecents
|
||||||
|
|
||||||
class DomainModule : InjektModule {
|
fun domainModule() = module {
|
||||||
override fun InjektRegistrar.registerInjectables() {
|
factory { TrustExtension(get(), get()) }
|
||||||
addFactory { TrustExtension(get(), get()) }
|
|
||||||
|
|
||||||
addSingletonFactory<ExtensionRepoRepository> { ExtensionRepoRepositoryImpl(get()) }
|
single<ExtensionRepoRepository> { ExtensionRepoRepositoryImpl(get()) }
|
||||||
addFactory { CreateExtensionRepo(get()) }
|
factory { CreateExtensionRepo(get()) }
|
||||||
addFactory { DeleteExtensionRepo(get()) }
|
factory { DeleteExtensionRepo(get()) }
|
||||||
addFactory { GetExtensionRepo(get()) }
|
factory { GetExtensionRepo(get()) }
|
||||||
addFactory { GetExtensionRepoCount(get()) }
|
factory { GetExtensionRepoCount(get()) }
|
||||||
addFactory { ReplaceExtensionRepo(get()) }
|
factory { ReplaceExtensionRepo(get()) }
|
||||||
addFactory { UpdateExtensionRepo(get(), get()) }
|
factory { UpdateExtensionRepo(get(), get()) }
|
||||||
|
|
||||||
addSingletonFactory<CustomMangaRepository> { CustomMangaRepositoryImpl(get()) }
|
single<CustomMangaRepository> { CustomMangaRepositoryImpl(get()) }
|
||||||
addFactory { CreateCustomManga(get()) }
|
factory { CreateCustomManga(get()) }
|
||||||
addFactory { DeleteCustomManga(get()) }
|
factory { DeleteCustomManga(get()) }
|
||||||
addFactory { GetCustomManga(get()) }
|
factory { GetCustomManga(get()) }
|
||||||
addFactory { RelinkCustomManga(get()) }
|
factory { RelinkCustomManga(get()) }
|
||||||
|
|
||||||
addSingletonFactory<MangaRepository> { MangaRepositoryImpl(get()) }
|
single<MangaRepository> { MangaRepositoryImpl(get()) }
|
||||||
addFactory { GetManga(get()) }
|
factory { GetManga(get()) }
|
||||||
addFactory { GetLibraryManga(get()) }
|
factory { GetLibraryManga(get()) }
|
||||||
addFactory { InsertManga(get()) }
|
factory { InsertManga(get()) }
|
||||||
addFactory { UpdateManga(get()) }
|
factory { UpdateManga(get()) }
|
||||||
|
|
||||||
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
single<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
||||||
addFactory { DeleteChapter(get()) }
|
factory { DeleteChapter(get()) }
|
||||||
addFactory { GetAvailableScanlators(get()) }
|
factory { GetAvailableScanlators(get()) }
|
||||||
addFactory { GetChapter(get()) }
|
factory { GetChapter(get()) }
|
||||||
addFactory { InsertChapter(get()) }
|
factory { InsertChapter(get()) }
|
||||||
addFactory { UpdateChapter(get()) }
|
factory { UpdateChapter(get()) }
|
||||||
|
|
||||||
addSingletonFactory<HistoryRepository> { HistoryRepositoryImpl(get()) }
|
single<HistoryRepository> { HistoryRepositoryImpl(get()) }
|
||||||
|
|
||||||
addFactory { GetRecents(get(), get()) }
|
factory { GetRecents(get(), get()) }
|
||||||
|
|
||||||
addSingletonFactory<CategoryRepository> { CategoryRepositoryImpl(get()) }
|
single<CategoryRepository> { CategoryRepositoryImpl(get()) }
|
||||||
addFactory { GetCategories(get()) }
|
factory { GetCategories(get()) }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,7 @@ import eu.kanade.tachiyomi.core.storage.AndroidStorageFolderProvider
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.track.TrackPreferences
|
import eu.kanade.tachiyomi.data.track.TrackPreferences
|
||||||
import eu.kanade.tachiyomi.network.NetworkPreferences
|
import eu.kanade.tachiyomi.network.NetworkPreferences
|
||||||
import uy.kohesive.injekt.api.InjektModule
|
import org.koin.dsl.module
|
||||||
import uy.kohesive.injekt.api.InjektRegistrar
|
|
||||||
import uy.kohesive.injekt.api.addSingletonFactory
|
|
||||||
import uy.kohesive.injekt.api.get
|
|
||||||
import yokai.domain.backup.BackupPreferences
|
import yokai.domain.backup.BackupPreferences
|
||||||
import yokai.domain.base.BasePreferences
|
import yokai.domain.base.BasePreferences
|
||||||
import yokai.domain.download.DownloadPreferences
|
import yokai.domain.download.DownloadPreferences
|
||||||
|
@ -22,47 +19,45 @@ import yokai.domain.storage.StoragePreferences
|
||||||
import yokai.domain.ui.UiPreferences
|
import yokai.domain.ui.UiPreferences
|
||||||
import yokai.domain.ui.settings.ReaderPreferences
|
import yokai.domain.ui.settings.ReaderPreferences
|
||||||
|
|
||||||
class PreferenceModule(val application: Application) : InjektModule {
|
fun preferenceModule(application: Application) = module {
|
||||||
override fun InjektRegistrar.registerInjectables() {
|
single<PreferenceStore> { AndroidPreferenceStore(application) }
|
||||||
addSingletonFactory<PreferenceStore> { AndroidPreferenceStore(application) }
|
|
||||||
|
|
||||||
addSingletonFactory { BasePreferences(get()) }
|
single { BasePreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { SourcePreferences(get()) }
|
single { SourcePreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { TrackPreferences(get()) }
|
single { TrackPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { UiPreferences(get()) }
|
single { UiPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { ReaderPreferences(get()) }
|
single { ReaderPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { RecentsPreferences(get()) }
|
single { RecentsPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { DownloadPreferences(get()) }
|
single { DownloadPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory {
|
single {
|
||||||
NetworkPreferences(
|
NetworkPreferences(
|
||||||
get(),
|
get(),
|
||||||
BuildConfig.FLAVOR == "dev" || BuildConfig.DEBUG || BuildConfig.NIGHTLY,
|
BuildConfig.FLAVOR == "dev" || BuildConfig.DEBUG || BuildConfig.NIGHTLY,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
addSingletonFactory { SecurityPreferences(get()) }
|
single { SecurityPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory { BackupPreferences(get()) }
|
single { BackupPreferences(get()) }
|
||||||
|
|
||||||
addSingletonFactory {
|
single {
|
||||||
PreferencesHelper(
|
PreferencesHelper(
|
||||||
context = application,
|
context = application,
|
||||||
preferenceStore = get(),
|
preferenceStore = get(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
addSingletonFactory {
|
single {
|
||||||
StoragePreferences(
|
StoragePreferences(
|
||||||
folderProvider = get<AndroidStorageFolderProvider>(),
|
folderProvider = get<AndroidStorageFolderProvider>(),
|
||||||
preferenceStore = get(),
|
preferenceStore = get(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,9 @@ kotlin {
|
||||||
androidMain {
|
androidMain {
|
||||||
dependencies {
|
dependencies {
|
||||||
// Dependency injection
|
// Dependency injection
|
||||||
api(libs.injekt.core)
|
api(project.dependencies.platform(libs.koin.bom))
|
||||||
|
api(libs.koin.core)
|
||||||
|
api(libs.koin.injekt)
|
||||||
|
|
||||||
// Network client
|
// Network client
|
||||||
api(libs.okhttp)
|
api(libs.okhttp)
|
||||||
|
|
|
@ -12,6 +12,7 @@ sqlite = "2.4.0"
|
||||||
sqldelight = "2.0.2"
|
sqldelight = "2.0.2"
|
||||||
junit = "5.8.2"
|
junit = "5.8.2"
|
||||||
kermit = "2.0.4"
|
kermit = "2.0.4"
|
||||||
|
koin = "4.0.0"
|
||||||
voyager = "1.1.0-beta02"
|
voyager = "1.1.0-beta02"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
@ -41,10 +42,13 @@ flexbox = { module = "com.google.android.flexbox:flexbox", version = "3.0.0" }
|
||||||
flexible-adapter-ui = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter-ui", version.ref = "flexible-adapter" }
|
flexible-adapter-ui = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter-ui", version.ref = "flexible-adapter" }
|
||||||
flexible-adapter = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter", version.ref = "flexible-adapter" }
|
flexible-adapter = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter", version.ref = "flexible-adapter" }
|
||||||
image-decoder = { module = "com.github.tachiyomiorg:image-decoder", version = "41c059e540" }
|
image-decoder = { module = "com.github.tachiyomiorg:image-decoder", version = "41c059e540" }
|
||||||
injekt-core = { module = "com.github.null2264.injekt:injekt-core", version = "4135455a2a" }
|
|
||||||
|
|
||||||
kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }
|
kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }
|
||||||
|
|
||||||
|
koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin" }
|
||||||
|
koin-core = { module = "io.insert-koin:koin-core" }
|
||||||
|
koin-injekt = { module = "com.github.null2264:injekt-koin", version = "7f944dd775" }
|
||||||
|
|
||||||
kotest-assertions = { module = "io.kotest:kotest-assertions-core", version = "5.9.1" }
|
kotest-assertions = { module = "io.kotest:kotest-assertions-core", version = "5.9.1" }
|
||||||
|
|
||||||
libarchive = { module = "me.zhanghai.android.libarchive:library", version = "1.1.0" }
|
libarchive = { module = "me.zhanghai.android.libarchive:library", version = "1.1.0" }
|
||||||
|
|
|
@ -12,7 +12,9 @@ kotlin {
|
||||||
val commonMain by getting {
|
val commonMain by getting {
|
||||||
dependencies {
|
dependencies {
|
||||||
api(kotlinx.serialization.json)
|
api(kotlinx.serialization.json)
|
||||||
api(libs.injekt.core)
|
api(project.dependencies.platform(libs.koin.bom))
|
||||||
|
api(libs.koin.core)
|
||||||
|
api(libs.koin.injekt)
|
||||||
api(libs.rxjava)
|
api(libs.rxjava)
|
||||||
api(libs.jsoup)
|
api(libs.jsoup)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue