Skip to content

Commit 32ac02f

Browse files
committed
Fixing some JS issues
1 parent 7941f11 commit 32ac02f

File tree

5 files changed

+37
-14
lines changed
  • firebase-common/src
  • firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database
  • firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore

5 files changed

+37
-14
lines changed

firebase-common/src/commonMain/kotlin/dev/gitlive/firebase/encoders.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,16 @@ inline fun <reified T> encode(value: T, buildSettings: EncodeSettings.Builder.()
4646
encode(value, EncodeSettings.BuilderImpl().apply(buildSettings).buildEncodeSettings())
4747

4848
inline fun <T : Any> encodeAsObject(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}): EncodedObject {
49+
if (value is Map<*, *> && value.keys.any { it !is String }) {
50+
throw IllegalArgumentException("$value is a Map containing non-String keys. Must be of the form Map<String, Any?>")
51+
}
4952
val encoded = encode(strategy, value, buildSettings) ?: throw IllegalArgumentException("$value was encoded as null. Must be of the form Map<String, Any?>")
5053
return encoded.asNativeMap()?.asEncodedObject() ?: throw IllegalArgumentException("$value was encoded as ${encoded::class}. Must be of the form Map<String, Any?>")
5154
}
5255
inline fun <reified T : Any> encodeAsObject(value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}): EncodedObject {
56+
if (value is Map<*, *> && value.keys.any { it !is String }) {
57+
throw IllegalArgumentException("$value is a Map containing non-String keys. Must be of the form Map<String, Any?>")
58+
}
5359
val encoded = encode(value, buildSettings) ?: throw IllegalArgumentException("$value was encoded as null. Must be of the form Map<String, Any?>")
5460
return encoded.asNativeMap()?.asEncodedObject() ?: throw IllegalArgumentException("$value was encoded as ${encoded::class}. Must be of the form Map<String, Any?>")
5561
}

firebase-common/src/commonTest/kotlin/dev/gitlive/firebase/EncodersTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ class EncodersTest {
422422
val testDataClass = TestData(mapOf("key" to "value"), mapOf(1 to 1), true, null, ValueClass(42))
423423
val encodedObject = encodeAsObject(TestData.serializer(), testDataClass) { encodeDefaults = false }
424424

425-
assertEquals(mapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "valueClass" to 42), encodedObject.raw)
425+
nativeAssertEquals(mapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "valueClass" to 42), encodedObject.raw)
426426

427427
val testMap = mapOf("one" to 1, "two" to null, "three" to false)
428428
assertEquals(testMap, encodeAsObject(testMap).raw)

firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/_encoders.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,42 @@ import kotlinx.serialization.descriptors.StructureKind
1010
import kotlin.js.Json
1111
import kotlin.js.json
1212

13-
actual data class EncodedObject(private val keyValues: List<Pair<String, Any?>>) : Json by json(*keyValues.toTypedArray()) {
13+
actual data class EncodedObject(private val keyValues: List<Pair<String, Any?>>) {
1414
actual companion object {
1515
actual val emptyEncodedObject: EncodedObject = EncodedObject(emptyList())
1616
}
1717

1818
actual val raw get() = keyValues.toMap()
19+
val json get() = json(*keyValues.toTypedArray())
1920
}
2021

21-
2222
@PublishedApi
2323
internal actual fun List<Pair<String, Any?>>.asEncodedObject() = EncodedObject(this)
2424

2525
@PublishedApi
26-
internal actual fun Any.asNativeMap(): Map<*, *>? = (this as? Json)?.let { json ->
26+
internal actual fun Any.asNativeMap(): Map<*, *>? {
27+
val json = when (this) {
28+
is Number -> null
29+
is Boolean -> null
30+
is String -> null
31+
is Map<*, *> -> {
32+
if (keys.all { it is String }) {
33+
this as Json
34+
} else {
35+
null
36+
}
37+
}
38+
is Collection<*> -> null
39+
is Array<*> -> null
40+
else -> {
41+
this as Json
42+
}
43+
} ?: return null
2744
val mutableMap = mutableMapOf<String, Any?>()
2845
for (key in js("Object").keys(json)) {
2946
mutableMap[key] = json[key]
3047
}
31-
mutableMap.toMap()
48+
return mutableMap.toMap()
3249
}
3350

3451
actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when(descriptor.kind) {

firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ internal actual class NativeDatabaseReference internal constructor(
183183
}
184184

185185
actual suspend fun updateEncodedChildren(encodedUpdate: EncodedObject) =
186-
rethrow { update(js, encodedUpdate).awaitWhileOnline(database) }
186+
rethrow { update(js, encodedUpdate.json).awaitWhileOnline(database) }
187187

188188

189189
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, buildSettings: EncodeDecodeSettingsBuilder.() -> Unit, transactionUpdate: (currentData: T) -> T): DataSnapshot {
@@ -235,7 +235,7 @@ internal actual class NativeOnDisconnect internal constructor(
235235
rethrow { js.set(encodedValue).awaitWhileOnline(database) }
236236

237237
actual suspend fun updateEncodedChildren(encodedUpdate: EncodedObject) =
238-
rethrow { js.update(encodedUpdate).awaitWhileOnline(database) }
238+
rethrow { js.update(encodedUpdate.json).awaitWhileOnline(database) }
239239

240240
}
241241

firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ internal actual class NativeWriteBatchWrapper actual internal constructor(actual
131131
documentRef: DocumentReference,
132132
encodedData: EncodedObject,
133133
setOptions: SetOptions
134-
): NativeWriteBatchWrapper = rethrow { js.set(documentRef.js, encodedData, setOptions.js) }.let { this }
134+
): NativeWriteBatchWrapper = rethrow { js.set(documentRef.js, encodedData.json, setOptions.js) }.let { this }
135135

136-
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject): NativeWriteBatchWrapper = rethrow { js.update(documentRef.js, encodedData) }
136+
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject): NativeWriteBatchWrapper = rethrow { js.update(documentRef.js, encodedData.json) }
137137
.let { this }
138138

139139
actual fun updateEncodedFieldsAndValues(
@@ -177,11 +177,11 @@ internal actual class NativeTransactionWrapper actual internal constructor(actua
177177
encodedData: EncodedObject,
178178
setOptions: SetOptions
179179
): NativeTransactionWrapper = rethrow {
180-
js.set(documentRef.js, encodedData, setOptions.js)
180+
js.set(documentRef.js, encodedData.json, setOptions.js)
181181
}
182182
.let { this }
183183

184-
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject): NativeTransactionWrapper = rethrow { js.update(documentRef.js, encodedData) }
184+
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject): NativeTransactionWrapper = rethrow { js.update(documentRef.js, encodedData.json) }
185185
.let { this }
186186

187187
actual fun updateEncodedFieldsAndValues(
@@ -245,10 +245,10 @@ internal actual class NativeDocumentReference actual constructor(actual val nati
245245
}
246246

247247
actual suspend fun setEncoded(encodedData: EncodedObject, setOptions: SetOptions) = rethrow {
248-
setDoc(js, encodedData, setOptions.js).await()
248+
setDoc(js, encodedData.json, setOptions.js).await()
249249
}
250250

251-
actual suspend fun updateEncoded(encodedData: EncodedObject) = rethrow { jsUpdate(js, encodedData).await() }
251+
actual suspend fun updateEncoded(encodedData: EncodedObject) = rethrow { jsUpdate(js, encodedData.json).await() }
252252

253253
actual suspend fun updateEncodedFieldsAndValues(encodedFieldsAndValues: List<Pair<String, Any?>>) {
254254
rethrow {
@@ -398,7 +398,7 @@ internal actual class NativeCollectionReferenceWrapper actual internal construct
398398
actual fun document(documentPath: String) = rethrow { NativeDocumentReference(doc(js, documentPath)) }
399399

400400
actual suspend fun addEncoded(data: EncodedObject) = rethrow {
401-
NativeDocumentReference(addDoc(js, data).await())
401+
NativeDocumentReference(addDoc(js, data.json).await())
402402
}
403403
}
404404

0 commit comments

Comments
 (0)