Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JVM SSR compatibility #8

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions buildSrc/src/main/kotlin/Shared.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPom
Expand All @@ -11,9 +13,12 @@ import org.gradle.kotlin.dsl.project
import org.gradle.kotlin.dsl.withType
import org.gradle.plugins.signing.Sign
import org.gradle.plugins.signing.SigningExtension
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

Expand Down Expand Up @@ -71,7 +76,9 @@ fun KotlinMultiplatformExtension.kotlinWasmTargets(withNode: Boolean = true) {
}
}

fun KotlinMultiplatformExtension.kotlinJvmTargets(target: String = "17") {
private const val kotlinVersion = "21"

fun KotlinMultiplatformExtension.kotlinJvmTargets(target: String = kotlinVersion) {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(target))
}
Expand All @@ -86,12 +93,31 @@ fun KotlinMultiplatformExtension.kotlinJvmTargets(target: String = "17") {
}
}

fun KotlinJvmProjectExtension.kotlinJvmTargets(target: String = "17") {
fun KotlinJvmProjectExtension.kotlinJvmTargets(target: String = kotlinVersion) {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(target))
}
}

@OptIn(ExperimentalKotlinGradlePluginApi::class)
fun KotlinMultiplatformExtension.kotlinJsCommonTargets() {
applyDefaultHierarchyTemplate {
sourceSetTrees(KotlinSourceSetTree.main, KotlinSourceSetTree.test)

common {
group("jsCommon") {
withJs()
withWasmJs()
}
}
}
}

val NamedDomainObjectContainer<KotlinSourceSet>.jsCommonMain: NamedDomainObjectProvider<KotlinSourceSet>
get() = named("jsCommonMain")
val NamedDomainObjectContainer<KotlinSourceSet>.jsCommonTest: NamedDomainObjectProvider<KotlinSourceSet>
get() = named("jsCommonTest")

fun Project.setupKsp() {
dependencies {
add("kspCommonMainMetadata", project(":plugins:kilua-ksp-processor"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
import kotlinx.serialization.serializer
import web.toJsString
import dev.kilua.dom.toJsString

class App : Application() {

Expand Down
32 changes: 12 additions & 20 deletions examples/playground/src/commonMain/kotlin/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,20 +49,16 @@ import dev.kilua.form.fieldWithLabel
import dev.kilua.form.form
import dev.kilua.form.number.imaskNumeric
import dev.kilua.form.number.numeric
import dev.kilua.form.number.range
import dev.kilua.form.number.rangeRef
import dev.kilua.form.select.TomSelectCallbacks
import dev.kilua.form.select.TomSelectRenders
import dev.kilua.form.select.tomSelect
import dev.kilua.form.select.tomSelectRef
import dev.kilua.form.text.richText
import dev.kilua.form.text.richTextRef
import dev.kilua.form.text.text
import dev.kilua.form.text.textRef
import dev.kilua.form.text.tomTypeahead
import dev.kilua.form.text.tomTypeaheadRef
import dev.kilua.form.time.richDate
import dev.kilua.form.time.richDateTime
import dev.kilua.form.time.richDateTimeRef
import dev.kilua.form.time.richTime
import dev.kilua.html.*
Expand All @@ -74,14 +70,12 @@ import dev.kilua.i18n.SimpleLocale
import dev.kilua.modal.FullscreenMode
import dev.kilua.modal.ModalSize
import dev.kilua.modal.confirm
import dev.kilua.modal.modal
import dev.kilua.modal.modalRef
import dev.kilua.panel.OffPlacement
import dev.kilua.panel.TabPosition
import dev.kilua.panel.accordion
import dev.kilua.panel.carousel
import dev.kilua.panel.lazyColumn
import dev.kilua.panel.offcanvas
import dev.kilua.panel.offcanvasRef
import dev.kilua.panel.splitPanel
import dev.kilua.panel.tabPanel
Expand Down Expand Up @@ -129,17 +123,15 @@ import dev.kilua.useModule
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.serialization.Serializable
import web.JsAny
import web.JsArray
import web.Promise
import web.RegExp
import web.dom.CustomEvent
import web.dom.HTMLElement
import web.dom.Text
import web.dom.events.Event
import web.toJsNumber
import web.toJsString
import web.window
import dev.kilua.dom.Promise
import dev.kilua.dom.RegExp
import dev.kilua.dom.api.CustomEvent
import dev.kilua.dom.api.HTMLElement
import dev.kilua.dom.api.Text
import dev.kilua.dom.core.JsAny
import dev.kilua.dom.core.toJsNumber
import dev.kilua.dom.core.toJsString
import dev.kilua.dom.window
import kotlin.random.Random
import kotlin.random.nextInt
import kotlin.random.nextUInt
Expand Down Expand Up @@ -581,7 +573,7 @@ class App : Application() {
null
}
result?.let { items: JsAny ->
callback(items.unsafeCast<JsArray<JsAny>>().toList().map { item ->
callback(items.unsafeCast<dev.kilua.dom.JsArray<JsAny>>().toList().map { item ->
jsObjectOf(
"value" to item["id"]!!,
"text" to item["name"]!!,
Expand Down Expand Up @@ -1335,7 +1327,7 @@ class App : Application() {
button {
+"click"
DisposableEffect("button") {
val f = { _: Event ->
val f = { _: dev.kilua.dom.api.events.Event ->
console.log("click $name of ${list.size}")
}
element.addEventListener("click", f)
Expand Down Expand Up @@ -1425,7 +1417,7 @@ class App : Application() {
size++
}
DisposableEffect("button2") {
val f = { _: Event ->
val f = { _: dev.kilua.dom.api.events.Event ->
console.log("button2 click")
}
element.addEventListener("click", f)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,10 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import web.JsAny
import web.JsArray
import web.JsString
import web.localStorage
import web.toJsString
import dev.kilua.dom.JsAny
import dev.kilua.dom.JsString
import dev.kilua.dom.localStorage
import dev.kilua.dom.toJsString

const val JWT_TOKEN = "jwtToken"

Expand Down Expand Up @@ -423,7 +422,7 @@ class ConduitManager : TokenProvider {
val json = JSON.parse<JsAny>(it)
val errors = json["errors"]!!
for (key in keys(errors)) {
val tab: JsArray<JsString> = errors[key]!!.unsafeCast()
val tab: dev.kilua.dom.JsArray<JsString> = errors[key]!!.unsafeCast()
result.addAll(tab.toList().map { "$key $it" })
}
result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ package io.realworld.externals

import dev.kilua.externals.Intl
import dev.kilua.utils.jsObjectOf
import web.JsAny
import dev.kilua.dom.JsAny

external class Date() : JsAny {
constructor(value: String?)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import dev.kilua.html.ul
import io.realworld.ConduitManager
import io.realworld.ConduitState
import io.realworld.View
import web.dom.events.Event

@Composable
fun IComponent.editorPage(state: ConduitState, conduitManager: ConduitManager) {
Expand Down Expand Up @@ -103,7 +102,7 @@ fun IComponent.editorPage(state: ConduitState, conduitManager: ConduitManager) {
className = "btn btn-primary btn-lg pull-xs-right"
)
}
onEvent<Event>("submit") { ev ->
onEvent<dev.kilua.dom.api.events.Event>("submit") { ev ->
ev.preventDefault()
if (isNewArticle) {
conduitManager.createArticle(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import dev.kilua.html.ul
import io.realworld.ConduitManager
import io.realworld.ConduitState
import io.realworld.View
import web.dom.events.Event

@Composable
fun IComponent.loginPage(state: ConduitState, conduitManager: ConduitManager) {
Expand Down Expand Up @@ -81,7 +80,7 @@ fun IComponent.loginPage(state: ConduitState, conduitManager: ConduitManager) {
type = ButtonType.Submit,
className = "btn btn-primary btn-lg pull-xs-right"
)
onEvent<Event>("submit") { ev ->
onEvent<dev.kilua.dom.api.events.Event>("submit") { ev ->
ev.preventDefault()
conduitManager.login(emailInput.value, passwordInput.value)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import dev.kilua.html.ul
import io.realworld.ConduitManager
import io.realworld.ConduitState
import io.realworld.View
import web.dom.events.Event

@Composable
fun IComponent.registerPage(state: ConduitState, conduitManager: ConduitManager) {
Expand Down Expand Up @@ -92,7 +91,7 @@ fun IComponent.registerPage(state: ConduitState, conduitManager: ConduitManager)
type = ButtonType.Submit,
className = "btn btn-primary btn-lg pull-xs-right"
)
onEvent<Event>("submit") { ev ->
onEvent<dev.kilua.dom.api.events.Event>("submit") { ev ->
ev.preventDefault()
conduitManager.register(usernameInput.value, emailInput.value, passwordInput.value)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import dev.kilua.html.li
import dev.kilua.html.ul
import io.realworld.ConduitManager
import io.realworld.ConduitState
import web.dom.events.Event

@Composable
fun IComponent.settingsPage(state: ConduitState, conduitManager: ConduitManager) {
Expand Down Expand Up @@ -108,7 +107,7 @@ fun IComponent.settingsPage(state: ConduitState, conduitManager: ConduitManager)
className = "btn btn-primary btn-lg pull-xs-right"
)
}
onEvent<Event>("submit") { ev ->
onEvent<dev.kilua.dom.api.events.Event>("submit") { ev ->
ev.preventDefault()
conduitManager.settings(
imageInput.value,
Expand Down
11 changes: 4 additions & 7 deletions examples/todomvc-ballast/src/commonMain/kotlin/TodoApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,6 @@ import dev.kilua.startApplication
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.context.startKoin
import web.dom.events.FocusEvent
import web.dom.events.KeyboardEvent
import web.dom.events.MouseEvent

const val ENTER_KEY = 13
const val ESC_KEY = 27
Expand Down Expand Up @@ -83,7 +80,7 @@ class App : Application(), KoinComponent {
h1 { +"todos" }
text(placeholder = "What needs to be done?", className = "new-todo") {
autofocus(true)
onEvent<KeyboardEvent>("keydown") { e ->
onEvent<dev.kilua.dom.api.events.KeyboardEvent>("keydown") { e ->
if (e.keyCode == ENTER_KEY) {
todoViewModel.addTodo(this.value)
this.value = null
Expand Down Expand Up @@ -118,7 +115,7 @@ class App : Application(), KoinComponent {
}
label {
+todo.title
onEvent<MouseEvent>("dblclick") {
onEvent<dev.kilua.dom.api.events.MouseEvent>("dblclick") {
[email protected]("editing")
edit.value = todo.title
edit.focus()
Expand All @@ -131,13 +128,13 @@ class App : Application(), KoinComponent {
}
}
edit = textRef(className = "edit") {
onEvent<FocusEvent>("blur") {
onEvent<dev.kilua.dom.api.events.FocusEvent>("blur") {
if ([email protected]("editing")) {
[email protected]("editing")
todoViewModel.editTodo(index, this.value)
}
}
onEvent<KeyboardEvent>("keydown") { e ->
onEvent<dev.kilua.dom.api.events.KeyboardEvent>("keydown") { e ->
if (e.keyCode == ENTER_KEY) {
todoViewModel.editTodo(index, this.value)
[email protected]("editing")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import web.localStorage
import dev.kilua.dom.localStorage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import dev.kilua.externals.get
import dev.kilua.externals.set
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.json.Json
import web.dom.Storage
import web.toJsString
import dev.kilua.dom.api.Storage
import dev.kilua.dom.core.toJsString

class TodoSavedStateAdapter(private val json: Json, private val storage: Storage) :
SavedStateAdapter<
Expand Down
11 changes: 4 additions & 7 deletions examples/todomvc/src/commonMain/kotlin/TodoApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,6 @@ import dev.kilua.html.span
import dev.kilua.html.strong
import dev.kilua.html.ul
import dev.kilua.startApplication
import web.dom.events.FocusEvent
import web.dom.events.KeyboardEvent
import web.dom.events.MouseEvent

const val ENTER_KEY = 13
const val ESC_KEY = 27
Expand Down Expand Up @@ -79,7 +76,7 @@ class App : Application() {
h1 { +"todos" }
text(placeholder = "What needs to be done?", className = "new-todo") {
autofocus(true)
onEvent<KeyboardEvent>("keydown") { e ->
onEvent<dev.kilua.dom.api.events.KeyboardEvent>("keydown") { e ->
if (e.keyCode == ENTER_KEY) {
viewModel.addTodo(this.value)
this.value = null
Expand Down Expand Up @@ -114,7 +111,7 @@ class App : Application() {
}
label {
+todo.title
onEvent<MouseEvent>("dblclick") {
onEvent<dev.kilua.dom.api.events.MouseEvent>("dblclick") {
[email protected]("editing")
edit.value = todo.title
edit.focus()
Expand All @@ -127,13 +124,13 @@ class App : Application() {
}
}
edit = textRef(className = "edit") {
onEvent<FocusEvent>("blur") {
onEvent<dev.kilua.dom.api.events.FocusEvent>("blur") {
if ([email protected]("editing")) {
[email protected]("editing")
viewModel.editTodo(index, this.value)
}
}
onEvent<KeyboardEvent>("keydown") { e ->
onEvent<dev.kilua.dom.api.events.KeyboardEvent>("keydown") { e ->
if (e.keyCode == ENTER_KEY) {
viewModel.editTodo(index, this.value)
[email protected]("editing")
Expand Down
4 changes: 2 additions & 2 deletions examples/todomvc/src/commonMain/kotlin/TodoViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
* SOFTWARE.
*/

import dev.kilua.dom.core.toJsString
import dev.kilua.externals.get
import dev.kilua.externals.set
import kotlinx.coroutines.CoroutineScope
Expand All @@ -32,8 +33,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.json.Json
import web.localStorage
import web.toJsString
import dev.kilua.dom.localStorage

class ViewModel {
private val appScope: CoroutineScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ kilua-published = "0.0.8"
kotlin = "2.0.0"
compose = "1.6.11"
dokka = "1.9.20"
nmcp = "0.0.8"
nmcp = "0.0.9"
ksp = "2.0.0-1.0.22"
detekt = "1.23.6"
npm-publish = "3.4.2"
Expand Down
Loading