From d10cae365326c5c22dc9bb8454f964f26ac9298c Mon Sep 17 00:00:00 2001 From: Tlaster Date: Wed, 1 Jul 2026 13:26:47 +0900 Subject: [PATCH 1/3] update kotlin 2.4 --- app/build.gradle.kts | 3 --- .../flare/ui/component/RssRichText.kt | 4 +--- .../flare/ui/screen/compose/DraftBoxScreen.kt | 4 +--- .../ui/screen/media/StatusMediaScreen.kt | 12 +++--------- .../ui/screen/settings/AiConfigScreen.kt | 4 +--- build-logic/build.gradle.kts | 2 +- .../buildlogic/FlareConventionSupport.kt | 5 ++++- .../flare/ui/component/ProfileHeader.kt | 8 ++------ .../component/status/CommonStatusComponent.kt | 16 ++++------------ .../component/status/UiTimelineComponent.kt | 4 +--- .../flare/ui/component/RssRichText.kt | 4 +--- .../status/DesktopTimelineMediaActions.kt | 4 +--- .../flare/ui/screen/compose/ComposeDialog.kt | 4 +--- .../ui/screen/gallery/GalleryDetailScreen.kt | 4 +--- .../flare/ui/screen/home/EditTabDialog.kt | 4 +--- .../ui/screen/settings/SettingsScreen.kt | 4 +--- .../action/BlueskyReportStatusDialog.kt | 4 +--- .../action/DeleteStatusConfirmDialog.kt | 4 +--- .../status/action/MastodonReportDialog.kt | 4 +--- .../status/action/MisskeyReportDialog.kt | 4 +--- .../agent/common/AgentRelationTools.kt | 4 +--- .../flare/data/network/rss/RssService.kt | 8 ++++---- .../data/network/rss/model/OpmlParser.kt | 4 ++-- .../presenter/home/rss/ExportOPMLPresenter.kt | 2 +- .../flare/data/network/rss/model/FeedTest.kt | 4 ++-- gradle/libs.versions.toml | 11 +++++------ kotlin-js-store/wasm/yarn.lock | 8 ++++---- shared/build.gradle.kts | 19 ------------------- .../data/datasource/microblog/ActionMenu.kt | 4 +--- .../ui/presenter/splash/SplashPresenter.kt | 4 +--- .../flare/ui/render/HtmlRenderRunMapper.kt | 7 +++---- .../flare/ui/render/TranslationJson.kt | 4 +--- .../dimension/flare/ui/render/UiRichText.kt | 4 +--- social/bluesky/build.gradle.kts | 17 +---------------- .../bluesky/BlueskyDirectMessageLoader.kt | 12 +++--------- social/fanbox/build.gradle.kts | 17 +---------------- social/mastodon/build.gradle.kts | 17 +---------------- .../flare/ui/model/mapper/Mastodon.kt | 4 +--- social/misskey/build.gradle.kts | 17 +---------------- social/pixiv/build.gradle.kts | 17 +---------------- social/vvo/build.gradle.kts | 17 +---------------- .../data/datasource/vvo/VVODataSource.kt | 4 +--- social/xqt/build.gradle.kts | 17 +---------------- 43 files changed, 66 insertions(+), 258 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 23d2ac7e5c..d97c1737cd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -245,6 +245,3 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} diff --git a/app/src/main/java/dev/dimension/flare/ui/component/RssRichText.kt b/app/src/main/java/dev/dimension/flare/ui/component/RssRichText.kt index a0e84cf0b7..33cc380b55 100644 --- a/app/src/main/java/dev/dimension/flare/ui/component/RssRichText.kt +++ b/app/src/main/java/dev/dimension/flare/ui/component/RssRichText.kt @@ -482,9 +482,7 @@ private fun RichTextScope.RenderNode( context.builder.append(node.text()) } - else -> { - Unit - } + else -> {} } } diff --git a/app/src/main/java/dev/dimension/flare/ui/screen/compose/DraftBoxScreen.kt b/app/src/main/java/dev/dimension/flare/ui/screen/compose/DraftBoxScreen.kt index 0258eb9ff1..9dcc60bc95 100644 --- a/app/src/main/java/dev/dimension/flare/ui/screen/compose/DraftBoxScreen.kt +++ b/app/src/main/java/dev/dimension/flare/ui/screen/compose/DraftBoxScreen.kt @@ -149,9 +149,7 @@ private fun DraftBoxItem( enabled = item.status != UiDraftStatus.SENDING, leadingContent = { when (item.status) { - UiDraftStatus.DRAFT -> { - Unit - } + UiDraftStatus.DRAFT -> {} UiDraftStatus.FAILED -> { FAIcon( diff --git a/app/src/main/java/dev/dimension/flare/ui/screen/media/StatusMediaScreen.kt b/app/src/main/java/dev/dimension/flare/ui/screen/media/StatusMediaScreen.kt index 28d7e85061..1f0735a5cf 100644 --- a/app/src/main/java/dev/dimension/flare/ui/screen/media/StatusMediaScreen.kt +++ b/app/src/main/java/dev/dimension/flare/ui/screen/media/StatusMediaScreen.kt @@ -1513,13 +1513,9 @@ private fun mediaViewerPresenter( fun shareMedia(data: UiMedia) { when (data) { - is UiMedia.Audio -> { - Unit - } + is UiMedia.Audio -> {} - is UiMedia.Gif -> { - Unit - } + is UiMedia.Gif -> {} is UiMedia.Image -> { scope.launch { @@ -1531,9 +1527,7 @@ private fun mediaViewerPresenter( } } - is UiMedia.Video -> { - Unit - } + is UiMedia.Video -> {} } } diff --git a/app/src/main/java/dev/dimension/flare/ui/screen/settings/AiConfigScreen.kt b/app/src/main/java/dev/dimension/flare/ui/screen/settings/AiConfigScreen.kt index 584be2a0dc..6317aa7cb0 100644 --- a/app/src/main/java/dev/dimension/flare/ui/screen/settings/AiConfigScreen.kt +++ b/app/src/main/java/dev/dimension/flare/ui/screen/settings/AiConfigScreen.kt @@ -1104,9 +1104,7 @@ internal fun TranslationConfigScreen(onBack: () -> Unit) { ) } - TranslateProviderOption.GoogleWeb -> { - Unit - } + TranslateProviderOption.GoogleWeb -> {} } } } diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 490d753df9..849b04f36f 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -11,7 +11,7 @@ repositories { dependencies { compileOnly("com.android.tools.build:gradle:9.2.1") - compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:2.3.21") + compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:2.4.0") implementation("org.jlleitschuh.gradle:ktlint-gradle:14.2.0") } diff --git a/build-logic/src/main/kotlin/dev/dimension/flare/buildlogic/FlareConventionSupport.kt b/build-logic/src/main/kotlin/dev/dimension/flare/buildlogic/FlareConventionSupport.kt index 461b04d69d..e84ff4d90e 100644 --- a/build-logic/src/main/kotlin/dev/dimension/flare/buildlogic/FlareConventionSupport.kt +++ b/build-logic/src/main/kotlin/dev/dimension/flare/buildlogic/FlareConventionSupport.kt @@ -29,7 +29,7 @@ enum class FlarePlatform { } class FlareMultiplatformLibraryPlugin : Plugin { - override fun apply(target: Project) = Unit + override fun apply(target: Project) {} } class FlareAndroidApplicationPlugin : Plugin { @@ -56,6 +56,9 @@ class FlareRootConventionsPlugin : Plugin { } } } + subproject.tasks.matching { it.name.startsWith("runKtlint") }.configureEach { + dependsOn(subproject.tasks.matching { it.name.startsWith("ksp") }) + } } } } diff --git a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/ProfileHeader.kt b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/ProfileHeader.kt index 83b1ab6952..6504ec4a01 100644 --- a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/ProfileHeader.kt +++ b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/ProfileHeader.kt @@ -162,9 +162,7 @@ private fun ProfileHeaderSuccess( isMe.onSuccess { if (!it) { when (followButtonState) { - is UiState.Error -> { - Unit - } + is UiState.Error -> {} is UiState.Loading -> { PlatformFilledTonalButton( @@ -382,9 +380,7 @@ private fun ProfileHeaderSuccess( } } - null -> { - Unit - } + null -> {} } MatricesDisplay( data = user.matrices, diff --git a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/CommonStatusComponent.kt b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/CommonStatusComponent.kt index 2690be3de2..f3a1014d52 100644 --- a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/CommonStatusComponent.kt +++ b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/CommonStatusComponent.kt @@ -707,9 +707,7 @@ internal fun TranslationDisplayBadge( ) } - TranslationDisplayState.Translated -> { - Unit - } + TranslationDisplayState.Translated -> {} TranslationDisplayState.Failed -> { FAIcon( @@ -720,9 +718,7 @@ internal fun TranslationDisplayBadge( ) } - TranslationDisplayState.Hidden -> { - Unit - } + TranslationDisplayState.Hidden -> {} } } } @@ -942,9 +938,7 @@ internal fun StatusActions( } // nested group is not supported - is ActionMenu.Group -> { - Unit - } + is ActionMenu.Group -> {} ActionMenu.Divider -> { PlatformDropdownMenuDivider() @@ -979,9 +973,7 @@ internal fun StatusActions( } // divider is only supported in group - ActionMenu.Divider -> { - Unit - } + ActionMenu.Divider -> {} } } } diff --git a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt index 25958967d1..a4f9d02daf 100644 --- a/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt +++ b/compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt @@ -384,9 +384,7 @@ private fun UserContent( ) } - else -> { - Unit - } + else -> {} } } } diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/RssRichText.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/RssRichText.kt index bdfe29f834..c3e714188c 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/RssRichText.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/RssRichText.kt @@ -413,9 +413,7 @@ private fun RichTextScope.RenderNode( context.builder.append(node.text()) } - else -> { - Unit - } + else -> {} } } diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/status/DesktopTimelineMediaActions.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/status/DesktopTimelineMediaActions.kt index ad3968b4a3..eadc5e157e 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/status/DesktopTimelineMediaActions.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/component/status/DesktopTimelineMediaActions.kt @@ -61,9 +61,7 @@ internal fun ProvideDesktopTimelineMediaActions(content: @Composable () -> Unit) ) } - TimelineMediaMenuAction.ShareImage -> { - Unit - } + TimelineMediaMenuAction.ShareImage -> {} TimelineMediaMenuAction.CopyLink -> { Toolkit.getDefaultToolkit().systemClipboard.setContents( diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/compose/ComposeDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/compose/ComposeDialog.kt index df10bd21f6..fcc754c8b5 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/compose/ComposeDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/compose/ComposeDialog.kt @@ -229,9 +229,7 @@ fun ComposeDialog( onBack?.invoke() } - ContentDialogButton.Close -> { - Unit - } + ContentDialogButton.Close -> {} } }, ) diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/gallery/GalleryDetailScreen.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/gallery/GalleryDetailScreen.kt index d8301af741..c5c54e064b 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/gallery/GalleryDetailScreen.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/gallery/GalleryDetailScreen.kt @@ -828,9 +828,7 @@ private fun LazyStaggeredGridScope.compactCommentsPreviewItems( } } } - onEmpty { - Unit - } + onEmpty {} onError { error -> item(span = StaggeredGridItemSpan.FullLine) { SectionTitle("Comments") diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home/EditTabDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home/EditTabDialog.kt index 1e1c015b6c..ddada102c8 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home/EditTabDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home/EditTabDialog.kt @@ -115,9 +115,7 @@ internal fun EditTabDialog( } } - ContentDialogButton.Secondary -> { - Unit - } + ContentDialogButton.Secondary -> {} ContentDialogButton.Close -> { onDismissRequest() diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/settings/SettingsScreen.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/settings/SettingsScreen.kt index e70c8d6760..a14840acd3 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/settings/SettingsScreen.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/settings/SettingsScreen.kt @@ -2114,9 +2114,7 @@ internal fun SettingsScreen( ) } - TranslateProviderOption.GoogleWeb -> { - Unit - } + TranslateProviderOption.GoogleWeb -> {} } } } diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/BlueskyReportStatusDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/BlueskyReportStatusDialog.kt index 6657ef418d..6bbfbb7501 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/BlueskyReportStatusDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/BlueskyReportStatusDialog.kt @@ -106,9 +106,7 @@ internal fun BlueskyReportStatusDialog( } } - ContentDialogButton.Secondary -> { - Unit - } + ContentDialogButton.Secondary -> {} ContentDialogButton.Close -> { onBack.invoke() diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/DeleteStatusConfirmDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/DeleteStatusConfirmDialog.kt index ee8e56e9f6..594eaf1b38 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/DeleteStatusConfirmDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/DeleteStatusConfirmDialog.kt @@ -47,9 +47,7 @@ internal fun DeleteStatusConfirmDialog( onBack.invoke() } - ContentDialogButton.Secondary -> { - Unit - } + ContentDialogButton.Secondary -> {} ContentDialogButton.Close -> { onBack.invoke() diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MastodonReportDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MastodonReportDialog.kt index 8d00aa116b..e98b9fc44f 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MastodonReportDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MastodonReportDialog.kt @@ -47,9 +47,7 @@ internal fun MastodonReportDialog( onBack.invoke() } - ContentDialogButton.Secondary -> { - Unit - } + ContentDialogButton.Secondary -> {} ContentDialogButton.Close -> { onBack.invoke() diff --git a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MisskeyReportDialog.kt b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MisskeyReportDialog.kt index 12244245ab..d9c4e07120 100644 --- a/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MisskeyReportDialog.kt +++ b/desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/status/action/MisskeyReportDialog.kt @@ -68,9 +68,7 @@ internal fun MisskeyReportDialog( onBack() } - ContentDialogButton.Secondary -> { - Unit - } + ContentDialogButton.Secondary -> {} ContentDialogButton.Close -> { onBack() diff --git a/feature/agent/src/commonMain/kotlin/dev/dimension/flare/feature/agent/common/AgentRelationTools.kt b/feature/agent/src/commonMain/kotlin/dev/dimension/flare/feature/agent/common/AgentRelationTools.kt index 6e42646dd3..ca7903adcf 100644 --- a/feature/agent/src/commonMain/kotlin/dev/dimension/flare/feature/agent/common/AgentRelationTools.kt +++ b/feature/agent/src/commonMain/kotlin/dev/dimension/flare/feature/agent/common/AgentRelationTools.kt @@ -459,9 +459,7 @@ private suspend fun AgentToolSession.availableRelationUsers(): List = is AgentMessagePart.Actions, is AgentMessagePart.Text, - -> { - Unit - } + -> {} } } }.distinctBy { it.platformType to it.key } diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/RssService.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/RssService.kt index 28bb69512a..6fe410441a 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/RssService.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/RssService.kt @@ -16,8 +16,8 @@ import nl.adaptivity.xmlutil.serialization.XML internal object RssService { private val xml by lazy { - XML { - defaultPolicy { + XML.v1 { + policy { autoPolymorphic = true ignoreUnknownChildren() } @@ -158,8 +158,8 @@ private val HEADER_CHARSET_REGEX = Regex("""(?:^|;)\s*charset\s*=\s*"?([^";\s]+)""", RegexOption.IGNORE_CASE) private val RssServiceXml by lazy { - XML { - defaultPolicy { + XML.v1 { + policy { autoPolymorphic = true ignoreUnknownChildren() } diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/OpmlParser.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/OpmlParser.kt index 617208bfbb..b0cd33e3be 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/OpmlParser.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/OpmlParser.kt @@ -15,8 +15,8 @@ internal fun decodeOpml(opmlContent: String): Opml { } private val opmlXml = - XML { - defaultPolicy { + XML.v1 { + policy { autoPolymorphic = true ignoreUnknownChildren() } diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt index d444963b1e..52c204a590 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt @@ -69,7 +69,7 @@ public class ExportOPMLPresenter : PresenterBase>() { ), ) - return XML { + return XML.v1 { indentString = " " }.encodeToString(Opml.serializer(), opml) } diff --git a/feature/subscription/src/commonTest/kotlin/dev/dimension/flare/data/network/rss/model/FeedTest.kt b/feature/subscription/src/commonTest/kotlin/dev/dimension/flare/data/network/rss/model/FeedTest.kt index 393618ee5e..7e96ead381 100644 --- a/feature/subscription/src/commonTest/kotlin/dev/dimension/flare/data/network/rss/model/FeedTest.kt +++ b/feature/subscription/src/commonTest/kotlin/dev/dimension/flare/data/network/rss/model/FeedTest.kt @@ -206,8 +206,8 @@ class FeedTest { } private val testXml = - XML { - defaultPolicy { + XML.v1 { + policy { autoPolymorphic = true ignoreUnknownChildren() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e294b6e3f8..67d528cf69 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ lifecycleViewmodelComposeVersion = "2.10.0" minSdk = "26" java = "25" agp = "9.2.1" -kotlin = "2.3.21" +kotlin = "2.4.0" core-ktx = "1.19.0" junit = "4.13.2" androidx-test-ext-junit = "1.3.0" @@ -29,9 +29,8 @@ kotlinx-collections-immutable = "0.5.0" kotlinx-serialization = "1.11.0" kotlinx-browser = "0.5.0" coil3 = "3.5.0" -ktorfit = "2.7.3" -ktorfitConverters = "2.7.2" -ktor = "3.5.0" +ktorfit = "2.7.5" +ktor = "3.5.1" prettytime = "5.0.9.Final" readability = "1.0.0" reorderable = "3.1.0" @@ -179,7 +178,7 @@ zoomable = { group = "me.saket.telephoto", name = "zoomable", version.ref = "zoo ktorfit-lib = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-lib", version.ref = "ktorfit" } ktorfit-ksp = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-ksp", version.ref = "ktorfit" } -ktorfit-converters-response = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-converters-response", version.ref = "ktorfitConverters" } +ktorfit-converters-response = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-converters-response", version.ref = "ktorfit" } ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" } ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" } @@ -221,7 +220,7 @@ material-motion-compose = { module = "io.github.fornewid:material-motion-compose precompose-molecule = { module = "moe.tlaster:precompose-molecule", version = "1.7.0-alpha03" } -xmlUtil = { module = "io.github.pdvrieze.xmlutil:serialization", version = "0.91.3" } +xmlUtil = { module = "io.github.pdvrieze.xmlutil:serialization", version = "1.0.0" } fluent-ui = { module = "io.github.compose-fluent:fluent", version = "v0.1.0" } diff --git a/kotlin-js-store/wasm/yarn.lock b/kotlin-js-store/wasm/yarn.lock index 5cd002cb9d..223672e7c1 100644 --- a/kotlin-js-store/wasm/yarn.lock +++ b/kotlin-js-store/wasm/yarn.lock @@ -17,7 +17,7 @@ resolved "https://registry.yarnpkg.com/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.50.1-build1.tgz#67dd9944b0e37ddb0ef2c8b195baa74ece838e44" integrity sha512-yH4M/SHN98NibniIwTVk6rwTJjy7n39l7zwWY3u+qsfZBGTi4lC1uEl2NDvIlkzsFtfCBvHBJJFJ1iuU3UzzEQ== -ws@8.18.3: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== +ws@8.20.1: + version "8.20.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.1.tgz#91a9ae2b312ccf98e0a85ec499b48cef45ab0ddb" + integrity sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w== diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 59b861cff4..e75f2e01d8 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -131,22 +131,3 @@ kotlin { room3 { schemaDirectory("$projectDir/schemas") } - -ktorfit { - compilerPluginVersion.set("2.3.4") -} - -afterEvaluate { -// val kspCommonMainKotlinMetadata by tasks - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/microblog/ActionMenu.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/microblog/ActionMenu.kt index 7c3636003f..5fda9e2b22 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/microblog/ActionMenu.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/microblog/ActionMenu.kt @@ -203,9 +203,7 @@ public fun ImmutableList.applyPostActionLayout(config: PostActionLay } } - ActionMenu.Divider -> { - Unit - } + ActionMenu.Divider -> {} } } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/splash/SplashPresenter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/splash/SplashPresenter.kt index f9efd7fe32..4c0f3a0a6c 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/splash/SplashPresenter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/splash/SplashPresenter.kt @@ -32,9 +32,7 @@ public class SplashPresenter( toLogin() } - is UiState.Loading -> { - Unit - } + is UiState.Loading -> {} is UiState.Success -> { delay(1000) diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/HtmlRenderRunMapper.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/HtmlRenderRunMapper.kt index 3787e9ea51..2e6f265202 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/HtmlRenderRunMapper.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/HtmlRenderRunMapper.kt @@ -79,11 +79,10 @@ private class RenderRunBuilder { } "span" -> { - if (element.classNames().contains("invisible")) { - Unit - } else { + val classNames = element.classNames() + if (!classNames.contains("invisible")) { renderChildren(element, style, block) - if (element.classNames().contains("ellipsis")) { + if (classNames.contains("ellipsis")) { appendText("…", style, block) } } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/TranslationJson.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/TranslationJson.kt index 1c40bae11b..b9d9098d26 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/TranslationJson.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/TranslationJson.kt @@ -199,9 +199,7 @@ private fun UiRichText.toProjectionBlocks(): List = var nextBlockId = 0 renderRuns.forEach { content -> when (content) { - is RenderContent.BlockImage -> { - Unit - } + is RenderContent.BlockImage -> {} is RenderContent.Text -> { val pieces = content.toProjectionPieces() diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/UiRichText.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/UiRichText.kt index d70d7a847c..1db064329a 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/UiRichText.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/render/UiRichText.kt @@ -164,9 +164,7 @@ public fun UiRichText.toTranslatableText(): String { var appendedTextBlock = false renderRuns.forEach { content -> when (content) { - is RenderContent.BlockImage -> { - Unit - } + is RenderContent.BlockImage -> {} is RenderContent.Text -> { val blockText = content.plainText().trim() diff --git a/social/bluesky/build.gradle.kts b/social/bluesky/build.gradle.kts index 72a1096ef7..80a67c4676 100644 --- a/social/bluesky/build.gradle.kts +++ b/social/bluesky/build.gradle.kts @@ -76,20 +76,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/bluesky/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDirectMessageLoader.kt b/social/bluesky/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDirectMessageLoader.kt index 5478de3366..77ec2bf5cf 100644 --- a/social/bluesky/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDirectMessageLoader.kt +++ b/social/bluesky/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDirectMessageLoader.kt @@ -188,9 +188,7 @@ internal class BlueskyDirectMessageLoader( deletedMessageKeys += Bluesky.deletedMessageKey(accountKey, message.value) } - is LogCreateMessageMessageUnion.Unknown -> { - Unit - } + is LogCreateMessageMessageUnion.Unknown -> {} } } @@ -204,15 +202,11 @@ internal class BlueskyDirectMessageLoader( deletedMessageKeys += Bluesky.deletedMessageKey(accountKey, message.value) } - is LogDeleteMessageMessageUnion.Unknown -> { - Unit - } + is LogDeleteMessageMessageUnion.Unknown -> {} } } - else -> { - Unit - } + else -> {} } } return DirectMessageDelta( diff --git a/social/fanbox/build.gradle.kts b/social/fanbox/build.gradle.kts index d2c3710781..a33e975f6b 100644 --- a/social/fanbox/build.gradle.kts +++ b/social/fanbox/build.gradle.kts @@ -57,20 +57,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/mastodon/build.gradle.kts b/social/mastodon/build.gradle.kts index b1b9590dbf..46d6debd70 100644 --- a/social/mastodon/build.gradle.kts +++ b/social/mastodon/build.gradle.kts @@ -73,20 +73,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/mastodon/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt b/social/mastodon/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt index d52e422ae0..670d28c2d1 100644 --- a/social/mastodon/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt +++ b/social/mastodon/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt @@ -1027,9 +1027,7 @@ private fun updateHtmlTagToken( ) } - else -> { - Unit - } + else -> {} } } node.childNodes().forEach { diff --git a/social/misskey/build.gradle.kts b/social/misskey/build.gradle.kts index 878019d099..bdc1ee4522 100644 --- a/social/misskey/build.gradle.kts +++ b/social/misskey/build.gradle.kts @@ -73,20 +73,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/pixiv/build.gradle.kts b/social/pixiv/build.gradle.kts index 4f88b9f179..9e9f5aaebf 100644 --- a/social/pixiv/build.gradle.kts +++ b/social/pixiv/build.gradle.kts @@ -58,20 +58,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/vvo/build.gradle.kts b/social/vvo/build.gradle.kts index f7438a178c..5848abbc6d 100644 --- a/social/vvo/build.gradle.kts +++ b/social/vvo/build.gradle.kts @@ -73,20 +73,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + diff --git a/social/vvo/src/commonMain/kotlin/dev/dimension/flare/data/datasource/vvo/VVODataSource.kt b/social/vvo/src/commonMain/kotlin/dev/dimension/flare/data/datasource/vvo/VVODataSource.kt index 7d7716229a..00a6ccb554 100644 --- a/social/vvo/src/commonMain/kotlin/dev/dimension/flare/data/datasource/vvo/VVODataSource.kt +++ b/social/vvo/src/commonMain/kotlin/dev/dimension/flare/data/datasource/vvo/VVODataSource.kt @@ -289,9 +289,7 @@ internal class VVODataSource( ) } - PagingRequest.Refresh -> { - Unit - } + PagingRequest.Refresh -> {} } val status = loadStatusDetail(statusKey) diff --git a/social/xqt/build.gradle.kts b/social/xqt/build.gradle.kts index 69fac912f3..35a168bb7b 100644 --- a/social/xqt/build.gradle.kts +++ b/social/xqt/build.gradle.kts @@ -74,20 +74,5 @@ kotlin { } } -ktorfit { - compilerPluginVersion.set("2.3.4") -} -afterEvaluate { - val runKtlintFormatOverCommonMainSourceSet by tasks - val runKtlintCheckOverCommonMainSourceSet by tasks - runKtlintFormatOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - runKtlintCheckOverCommonMainSourceSet.dependsOn("kspCommonMainKotlinMetadata") - tasks { - configureEach { - if (this.name != "kspCommonMainKotlinMetadata" && this.name.startsWith("ksp")) { - this.dependsOn("kspCommonMainKotlinMetadata") - } - } - } -} + From 94a1c8ae350caf465f906efeb18ec0e5fa1dd956 Mon Sep 17 00:00:00 2001 From: Tlaster Date: Wed, 1 Jul 2026 13:58:03 +0900 Subject: [PATCH 2/3] fix test --- .../dev/dimension/flare/data/network/rss/model/Feed.kt | 6 +++--- .../kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt | 2 +- .../flare/ui/presenter/home/rss/ExportOPMLPresenter.kt | 10 +++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/Feed.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/Feed.kt index d4fc06ccb2..0a0c636130 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/Feed.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/data/network/rss/model/Feed.kt @@ -271,7 +271,7 @@ internal sealed interface Feed { @XmlElement(true) val lastBuildDate: String? = null, @XmlElement(true) - val category: String? = null, + val category: List = emptyList(), @XmlElement(true) val generator: String? = null, @XmlElement(true) @@ -347,7 +347,7 @@ internal sealed interface Feed { @XmlElement(true) val author: String? = null, @XmlElement(true) - val category: String? = null, + val category: List = emptyList(), @XmlElement(true) val comments: String? = null, @XmlElement(true) @@ -363,7 +363,7 @@ internal sealed interface Feed { val source: Source? = null, @XmlElement(true) @XmlSerialName(value = "content", prefix = "media", namespace = "http://search.yahoo.com/mrss/") - val mediaContent: Media? = null, + val mediaContent: List = emptyList(), ) @Serializable diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt index 6fff954783..1d64480d74 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Rss.kt @@ -110,7 +110,7 @@ internal fun Feed.Rss20.Item.render( ?.select("img") ?.firstOrNull() ?.attr("src") - ?.takeIf { it.isNotEmpty() } ?: mediaContent?.url + ?.takeIf { it.isNotEmpty() } ?: mediaContent.firstOrNull()?.url return UiTimelineV2.Feed( title = title, description = descHtml?.text(), diff --git a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt index 52c204a590..5a02c26ea4 100644 --- a/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt +++ b/feature/subscription/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/home/rss/ExportOPMLPresenter.kt @@ -69,8 +69,12 @@ public class ExportOPMLPresenter : PresenterBase>() { ), ) - return XML.v1 { - indentString = " " - }.encodeToString(Opml.serializer(), opml) + return XML + .v1 { + indentString = " " + }.encodeToString( + Opml.serializer(), + opml, + ) } } From 44088b16c74e2699c2df9e989c2f92604b5305bd Mon Sep 17 00:00:00 2001 From: Tlaster Date: Wed, 1 Jul 2026 14:52:25 +0900 Subject: [PATCH 3/3] fix web build --- web-shared/build.gradle.kts | 21 ++++++++++++++ web-shared/src/wasmJsMain/types/flare.d.mts | 31 +++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 web-shared/src/wasmJsMain/types/flare.d.mts diff --git a/web-shared/build.gradle.kts b/web-shared/build.gradle.kts index 282373bdae..23ec94dfe4 100644 --- a/web-shared/build.gradle.kts +++ b/web-shared/build.gradle.kts @@ -13,6 +13,7 @@ plugins { val webPresenterManifest = layout.buildDirectory.file("generated/web-presenters/manifest/flare-web-presenters.json") val webPresenterTsDir = layout.buildDirectory.dir("generated/web-presenters/ts") val webPresenterTsGenerator = rootProject.layout.projectDirectory.file("web/scripts/generate-presenters.mjs") +val webSharedTypeScriptDeclarations = layout.projectDirectory.file("src/wasmJsMain/types/flare.d.mts") kotlin { flare { @@ -116,3 +117,23 @@ tasks.matching { }.configureEach { dependsOn(generateWebPresenterTs) } + +val copyDevelopmentLibraryTypeScriptDeclarations = + tasks.register("copyDevelopmentLibraryTypeScriptDeclarations") { + from(webSharedTypeScriptDeclarations) + into(layout.buildDirectory.dir("dist/wasmJs/developmentLibrary")) + } + +val copyProductionLibraryTypeScriptDeclarations = + tasks.register("copyProductionLibraryTypeScriptDeclarations") { + from(webSharedTypeScriptDeclarations) + into(layout.buildDirectory.dir("dist/wasmJs/productionLibrary")) + } + +tasks.named("wasmJsBrowserDevelopmentLibraryDistribution") { + finalizedBy(copyDevelopmentLibraryTypeScriptDeclarations) +} + +tasks.named("wasmJsBrowserProductionLibraryDistribution") { + finalizedBy(copyProductionLibraryTypeScriptDeclarations) +} diff --git a/web-shared/src/wasmJsMain/types/flare.d.mts b/web-shared/src/wasmJsMain/types/flare.d.mts new file mode 100644 index 0000000000..f7d31363e3 --- /dev/null +++ b/web-shared/src/wasmJsMain/types/flare.d.mts @@ -0,0 +1,31 @@ +export type WebPresenterRefs = unknown[]; +export type WebPresenterCallbacks = unknown[]; + +export function webPresenterCreate( + name: string, + argsJson: string, + callbacks: WebPresenterCallbacks +): number; +export function webPresenterBindRef(name: string, presenter: unknown): number; +export function webPresenterSubscribe( + id: number, + listener: (snapshotJson: string, refs: WebPresenterRefs) => void +): number; +export function webPresenterDispatch(id: number, actionJson: string, refs: WebPresenterRefs): void; +export function webPresenterCall( + id: number, + actionJson: string, + refs: WebPresenterRefs, + listener: (json: string, refs: WebPresenterRefs) => void +): void; +export function webPresenterUnsubscribe(id: number, subscriptionId: number): void; +export function webPresenterClose(id: number): void; +export function webSharedInitialize(): void; +export function webSharedInstallFormatter( + formatNumber: (value: number) => string, + formatRelativeInstant: (epochMillis: number) => string, + formatFullInstant: (epochMillis: number) => string, + formatAbsoluteInstant: (epochMillis: number) => string +): void; + +export const memory: WebAssembly.Memory;