Skip to content

Commit c0463cd

Browse files
committed
refactor .js property to an extension
1 parent 9fe68c2 commit c0463cd

File tree

19 files changed

+151
-60
lines changed

19 files changed

+151
-60
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ It uses the <a href="https://github.com/GitLiveApp/firebase-java-sdk">Firebase J
258258

259259
### Accessing the underlying Firebase SDK
260260

261-
In some cases you might want to access the underlying official Firebase SDK in platform specific code, for example when the common API is missing the functionality you need. For this purpose each class in the SDK has `android`, `ios` and `js` properties which holds the equivalent object of the underlying official Firebase SDK. For *JVM*, as the `firebase-java-sdk` is a direct port of the Firebase Android SDK, is it also accessed via the `android` property.
261+
In some cases you might want to access the underlying official Firebase SDK in platform specific code, for example when the common API is missing the functionality you need. For this purpose each class in the SDK has `android`, `ios` and `js` extension properties that hold the equivalent object of the underlying official Firebase SDK. For *JVM*, as the `firebase-java-sdk` is a direct port of the Firebase Android SDK, is it also accessed via the `android` property.
262262

263263
These properties are only accessible from the equivalent target's source set. For example to disable persistence in Cloud Firestore on Android you can write the following in your Android specific code (e.g. `androidMain` or `androidTest`):
264264

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ actual fun Firebase.initialize(context: Any?, options: FirebaseOptions, name: St
2626
actual fun Firebase.initialize(context: Any?, options: FirebaseOptions) =
2727
FirebaseApp(initializeApp(options.toJson()))
2828

29-
actual class FirebaseApp internal constructor(val js: JsFirebaseApp) {
29+
val FirebaseApp.js: JsFirebaseApp get() = js
30+
31+
actual class FirebaseApp internal constructor(internal val js: JsFirebaseApp) {
3032
actual val name: String
3133
get() = js.name
3234
actual val options: FirebaseOptions

firebase-auth/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitlive/firebase-auth",
3-
"version": "1.12.0",
3+
"version": "2.0.0",
44
"description": "Wrapper around firebase for usage in Kotlin Multiplatform projects",
55
"main": "firebase-auth.js",
66
"scripts": {
@@ -23,7 +23,7 @@
2323
},
2424
"homepage": "https://github.com/GitLiveApp/firebase-kotlin-sdk",
2525
"dependencies": {
26-
"@gitlive/firebase-app": "1.12.0",
26+
"@gitlive/firebase-app": "2.0.0",
2727
"firebase": "9.19.1",
2828
"kotlin": "1.8.20",
2929
"kotlinx-coroutines-core": "1.6.4"

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,27 @@ import dev.gitlive.firebase.Firebase
88
import dev.gitlive.firebase.FirebaseApp
99
import dev.gitlive.firebase.FirebaseException
1010
import dev.gitlive.firebase.FirebaseNetworkException
11-
import dev.gitlive.firebase.auth.externals.*
11+
import dev.gitlive.firebase.auth.externals.Auth
12+
import dev.gitlive.firebase.auth.externals.getAuth
13+
import dev.gitlive.firebase.auth.externals.applyActionCode
14+
import dev.gitlive.firebase.auth.externals.confirmPasswordReset
15+
import dev.gitlive.firebase.auth.externals.createUserWithEmailAndPassword
16+
import dev.gitlive.firebase.auth.externals.sendPasswordResetEmail
17+
import dev.gitlive.firebase.auth.externals.fetchSignInMethodsForEmail
18+
import dev.gitlive.firebase.auth.externals.sendSignInLinkToEmail
19+
import dev.gitlive.firebase.auth.externals.isSignInWithEmailLink
20+
import dev.gitlive.firebase.auth.externals.signInWithEmailAndPassword
21+
import dev.gitlive.firebase.auth.externals.signInWithCustomToken
22+
import dev.gitlive.firebase.auth.externals.signInAnonymously
23+
import dev.gitlive.firebase.auth.externals.signInWithCredential
24+
import dev.gitlive.firebase.auth.externals.signInWithEmailLink
25+
import dev.gitlive.firebase.auth.externals.signOut
26+
import dev.gitlive.firebase.auth.externals.updateCurrentUser
27+
import dev.gitlive.firebase.auth.externals.verifyPasswordResetCode
28+
import dev.gitlive.firebase.auth.externals.checkActionCode
29+
import dev.gitlive.firebase.auth.externals.connectAuthEmulator
30+
import dev.gitlive.firebase.auth.externals.IdTokenResult
31+
import dev.gitlive.firebase.js
1232
import kotlinx.coroutines.await
1333
import kotlinx.coroutines.channels.awaitClose
1434
import kotlinx.coroutines.flow.callbackFlow
@@ -21,7 +41,9 @@ actual val Firebase.auth
2141
actual fun Firebase.auth(app: FirebaseApp) =
2242
rethrow { FirebaseAuth(getAuth(app.js)) }
2343

24-
actual class FirebaseAuth internal constructor(val js: Auth) {
44+
val FirebaseAuth.js: Auth get() = js
45+
46+
actual class FirebaseAuth internal constructor(internal val js: Auth) {
2547

2648
actual val currentUser: FirebaseUser?
2749
get() = rethrow { js.currentUser?.let { FirebaseUser(it) } }
@@ -106,12 +128,16 @@ actual class FirebaseAuth internal constructor(val js: Auth) {
106128
actual fun useEmulator(host: String, port: Int) = rethrow { connectAuthEmulator(js, "http://$host:$port") }
107129
}
108130

109-
actual class AuthResult internal constructor(val js: JsAuthResult) {
131+
val AuthResult.js: JsAuthResult get() = js
132+
133+
actual class AuthResult internal constructor(internal val js: JsAuthResult) {
110134
actual val user: FirebaseUser?
111135
get() = rethrow { js.user?.let { FirebaseUser(it) } }
112136
}
113137

114-
actual class AuthTokenResult(val js: IdTokenResult) {
138+
val AuthTokenResult.js: IdTokenResult get() = js
139+
140+
actual class AuthTokenResult(internal val js: IdTokenResult) {
115141
// actual val authTimestamp: Long
116142
// get() = js.authTime
117143
actual val claims: Map<String, Any>

firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ import dev.gitlive.firebase.auth.externals.EmailAuthProvider
55
import dev.gitlive.firebase.auth.externals.FacebookAuthProvider
66
import dev.gitlive.firebase.auth.externals.GithubAuthProvider
77
import dev.gitlive.firebase.auth.externals.GoogleAuthProvider
8-
import dev.gitlive.firebase.auth.externals.PhoneAuthProvider
8+
import dev.gitlive.firebase.auth.externals.IdTokenResult
9+
import dev.gitlive.firebase.auth.externals.PhoneAuthProvider as JsPhoneAuthProvider
910
import dev.gitlive.firebase.auth.externals.TwitterAuthProvider
1011
import kotlinx.coroutines.await
1112
import kotlin.js.json
1213
import dev.gitlive.firebase.auth.externals.AuthCredential as JsAuthCredential
1314
import dev.gitlive.firebase.auth.externals.OAuthProvider as JsOAuthProvider
1415

15-
actual open class AuthCredential(val js: JsAuthCredential) {
16+
val AuthCredential.js: JsAuthCredential get() = js
17+
18+
actual open class AuthCredential(internal val js: JsAuthCredential) {
1619
actual val providerId: String
1720
get() = js.providerId
1821
}
@@ -49,7 +52,9 @@ actual object GoogleAuthProvider {
4952
}
5053
}
5154

52-
actual class OAuthProvider(val js: JsOAuthProvider) {
55+
val OAuthProvider.js: JsOAuthProvider get() = js
56+
57+
actual class OAuthProvider(internal val js: JsOAuthProvider) {
5358

5459
actual constructor(
5560
provider: String,
@@ -78,11 +83,13 @@ actual class OAuthProvider(val js: JsOAuthProvider) {
7883
}
7984
}
8085

81-
actual class PhoneAuthProvider(val js: PhoneAuthProvider) {
86+
val PhoneAuthProvider.js: JsPhoneAuthProvider get() = js
87+
88+
actual class PhoneAuthProvider(internal val js: JsPhoneAuthProvider) {
8289

83-
actual constructor(auth: FirebaseAuth) : this(PhoneAuthProvider(auth.js))
90+
actual constructor(auth: FirebaseAuth) : this(JsPhoneAuthProvider(auth.js))
8491

85-
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(PhoneAuthProvider.credential(verificationId, smsCode))
92+
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(JsPhoneAuthProvider.credential(verificationId, smsCode))
8693
actual suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential = rethrow {
8794
val verificationId = js.verifyPhoneNumber(phoneNumber, verificationProvider.verifier).await()
8895
val verificationCode = verificationProvider.getVerificationCode(verificationId)

firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import dev.gitlive.firebase.auth.externals.MultiFactorInfo as JsMultiFactorInfo
88
import dev.gitlive.firebase.auth.externals.MultiFactorResolver as JsMultiFactorResolver
99
import dev.gitlive.firebase.auth.externals.MultiFactorSession as JsMultiFactorSession
1010

11-
actual class MultiFactor(val js: MultiFactorUser) {
11+
val MultiFactor.js get() = js
12+
13+
actual class MultiFactor(internal val js: MultiFactorUser) {
1214
actual val enrolledFactors: List<MultiFactorInfo>
1315
get() = rethrow { js.enrolledFactors.map { MultiFactorInfo(it) } }
1416
actual suspend fun enroll(multiFactorAssertion: MultiFactorAssertion, displayName: String?) =
@@ -21,7 +23,9 @@ actual class MultiFactor(val js: MultiFactorUser) {
2123
rethrow { js.unenroll(factorUid).await() }
2224
}
2325

24-
actual class MultiFactorInfo(val js: JsMultiFactorInfo) {
26+
val MultiFactorInfo.js get() = js
27+
28+
actual class MultiFactorInfo(internal val js: JsMultiFactorInfo) {
2529
actual val displayName: String?
2630
get() = rethrow { js.displayName }
2731
actual val enrollmentTime: Double
@@ -32,14 +36,20 @@ actual class MultiFactorInfo(val js: JsMultiFactorInfo) {
3236
get() = rethrow { js.uid }
3337
}
3438

35-
actual class MultiFactorAssertion(val js: JsMultiFactorAssertion) {
39+
val MultiFactorAssertion.js get() = js
40+
41+
actual class MultiFactorAssertion(internal val js: JsMultiFactorAssertion) {
3642
actual val factorId: String
3743
get() = rethrow { js.factorId }
3844
}
3945

40-
actual class MultiFactorSession(val js: JsMultiFactorSession)
46+
val MultiFactorSession.js get() = js
47+
48+
actual class MultiFactorSession(internal val js: JsMultiFactorSession)
49+
50+
val MultiFactorResolver.js get() = js
4151

42-
actual class MultiFactorResolver(val js: JsMultiFactorResolver) {
52+
actual class MultiFactorResolver(internal val js: JsMultiFactorResolver) {
4353
actual val auth: FirebaseAuth = rethrow { FirebaseAuth(js.auth) }
4454
actual val hints: List<MultiFactorInfo> = rethrow { js.hints.map { MultiFactorInfo(it) } }
4555
actual val session: MultiFactorSession = rethrow { MultiFactorSession(js.session) }

firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/user.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import kotlin.js.Date
66
import dev.gitlive.firebase.auth.externals.UserInfo as JsUserInfo
77
import kotlin.js.json
88

9-
actual class FirebaseUser internal constructor(val js: User) {
9+
val FirebaseUser.js get() = js
10+
11+
actual class FirebaseUser internal constructor(internal val js: User) {
1012
actual val uid: String
1113
get() = rethrow { js.uid }
1214
actual val displayName: String?
@@ -55,7 +57,9 @@ actual class FirebaseUser internal constructor(val js: User) {
5557
actual suspend fun verifyBeforeUpdateEmail(newEmail: String, actionCodeSettings: ActionCodeSettings?) = rethrow { verifyBeforeUpdateEmail(js, newEmail, actionCodeSettings?.toJson()).await() }
5658
}
5759

58-
actual class UserInfo(val js: JsUserInfo) {
60+
val UserInfo.js get() = js
61+
62+
actual class UserInfo(internal val js: JsUserInfo) {
5963
actual val displayName: String?
6064
get() = rethrow { js.displayName }
6165
actual val email: String?
@@ -70,7 +74,9 @@ actual class UserInfo(val js: JsUserInfo) {
7074
get() = rethrow { js.uid }
7175
}
7276

73-
actual class UserMetaData(val js: UserMetadata) {
77+
val UserMetaData.js get() = js
78+
79+
actual class UserMetaData(internal val js: UserMetadata) {
7480
actual val creationTime: Double?
7581
get() = rethrow {js.creationTime?.let { (Date(it).getTime() / 1000.0) } }
7682
actual val lastSignInTime: Double?

firebase-config/src/jsMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfig.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dev.gitlive.firebase.remoteconfig
33
import dev.gitlive.firebase.Firebase
44
import dev.gitlive.firebase.FirebaseApp
55
import dev.gitlive.firebase.FirebaseException
6+
import dev.gitlive.firebase.js
67
import dev.gitlive.firebase.remoteconfig.externals.*
78
import kotlinx.coroutines.await
89
import kotlin.js.json
@@ -14,7 +15,9 @@ actual fun Firebase.remoteConfig(app: FirebaseApp): FirebaseRemoteConfig = rethr
1415
FirebaseRemoteConfig(getRemoteConfig(app.js))
1516
}
1617

17-
actual class FirebaseRemoteConfig internal constructor(val js: RemoteConfig) {
18+
val FirebaseRemoteConfig.js get() = js
19+
20+
actual class FirebaseRemoteConfig internal constructor(internal val js: RemoteConfig) {
1821
actual val all: Map<String, FirebaseRemoteConfigValue>
1922
get() = rethrow { getAllKeys().map { Pair(it, getValue(it)) }.toMap() }
2023

firebase-config/src/jsMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfigValue.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package dev.gitlive.firebase.remoteconfig
22

33
import dev.gitlive.firebase.remoteconfig.externals.Value
44

5-
actual class FirebaseRemoteConfigValue(val js: Value) {
5+
val FirebaseRemoteConfigValue.js get() = js
6+
7+
actual class FirebaseRemoteConfigValue(internal val js: Value) {
68
actual fun asBoolean(): Boolean = rethrow { js.asBoolean() }
79
actual fun asByteArray(): ByteArray = rethrow { js.asString()?.encodeToByteArray() ?: byteArrayOf() }
810
actual fun asDouble(): Double = rethrow { js.asNumber().toDouble() }

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ import dev.gitlive.firebase.database.externals.ref
2727
import dev.gitlive.firebase.database.externals.remove
2828
import dev.gitlive.firebase.database.externals.set
2929
import dev.gitlive.firebase.database.externals.update
30+
import dev.gitlive.firebase.database.js
3031
import dev.gitlive.firebase.internal.EncodedObject
3132
import dev.gitlive.firebase.internal.decode
3233
import dev.gitlive.firebase.internal.js
3334
import dev.gitlive.firebase.internal.reencodeTransformation
35+
import dev.gitlive.firebase.js
3436
import kotlinx.coroutines.asDeferred
3537
import kotlinx.coroutines.channels.awaitClose
3638
import kotlinx.coroutines.coroutineScope
@@ -57,6 +59,7 @@ import dev.gitlive.firebase.database.externals.orderByKey as jsOrderByKey
5759
import dev.gitlive.firebase.database.externals.orderByValue as jsOrderByValue
5860
import dev.gitlive.firebase.database.externals.runTransaction as jsRunTransaction
5961
import dev.gitlive.firebase.database.externals.startAt as jsStartAt
62+
import dev.gitlive.firebase.database.js as publicJs
6063

6164
actual val Firebase.database
6265
get() = rethrow { FirebaseDatabase(getDatabase()) }
@@ -70,7 +73,9 @@ actual fun Firebase.database(url: String) =
7073
actual fun Firebase.database(app: FirebaseApp, url: String) =
7174
rethrow { FirebaseDatabase(getDatabase(app = app.js, url = url)) }
7275

73-
actual class FirebaseDatabase internal constructor(val js: Database) {
76+
val FirebaseDatabase.js get() = js
77+
78+
actual class FirebaseDatabase internal constructor(internal val js: Database) {
7479

7580
actual fun reference(path: String) = rethrow { DatabaseReference(NativeDatabaseReference(ref(js, path), js)) }
7681
actual fun reference() = rethrow { DatabaseReference(NativeDatabaseReference(ref(js), js)) }
@@ -89,13 +94,14 @@ internal actual open class NativeQuery(
8994
val database: Database
9095
)
9196

97+
val Query.js: JsQuery get() = nativeQuery.js
98+
9299
actual open class Query internal actual constructor(
93-
nativeQuery: NativeQuery
100+
internal val nativeQuery: NativeQuery
94101
) {
95102

96103
internal constructor(js: JsQuery, database: Database) : this(NativeQuery(js, database))
97104

98-
open val js: JsQuery = nativeQuery.js
99105
val database: Database = nativeQuery.database
100106

101107
actual fun orderByKey() = Query(query(js, jsOrderByKey()), database)
@@ -196,8 +202,10 @@ internal actual class NativeDatabaseReference internal constructor(
196202
}
197203
}
198204

205+
val DataSnapshot.js: JsDataSnapshot get() = js
206+
199207
actual class DataSnapshot internal constructor(
200-
val js: JsDataSnapshot,
208+
internal val js: JsDataSnapshot,
201209
val database: Database
202210
) {
203211
actual val value get(): Any? {
@@ -206,10 +214,10 @@ actual class DataSnapshot internal constructor(
206214
}
207215

208216
actual inline fun <reified T> value() =
209-
rethrow { decode<T>(value = js.`val`()) }
217+
rethrow { decode<T>(value = publicJs.`val`()) }
210218

211219
actual inline fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit) =
212-
rethrow { decode(strategy, js.`val`(), buildSettings) }
220+
rethrow { decode(strategy, publicJs.`val`(), buildSettings) }
213221

214222
actual val exists get() = rethrow { js.exists() }
215223
actual val key get() = rethrow { js.key }

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import dev.gitlive.firebase.firestore.externals.persistentLocalCache
2323
import dev.gitlive.firebase.firestore.internal.NativeDocumentSnapshotWrapper
2424
import dev.gitlive.firebase.firestore.internal.NativeFirebaseFirestoreWrapper
2525
import dev.gitlive.firebase.firestore.internal.SetOptions
26+
import dev.gitlive.firebase.js
2627
import kotlin.js.Json
2728
import kotlin.js.json
2829
import dev.gitlive.firebase.firestore.externals.Firestore as JsFirestore
@@ -79,7 +80,7 @@ actual data class FirebaseFirestoreSettings(
7980
}
8081

8182
@Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE")
82-
val js: Json get() = json().apply {
83+
internal val js: Json get() = json().apply {
8384
set("ssl", sslEnabled)
8485
set("host", host)
8586
set("localCache",
@@ -90,11 +91,11 @@ actual data class FirebaseFirestoreSettings(
9091
).asDynamic() as PersistentCacheSettings
9192
)
9293
is LocalCacheSettings.Memory -> {
93-
val garbageCollecorSettings = when (val garbageCollectorSettings = cacheSettings.garbaseCollectorSettings) {
94+
val garbageCollectorSettings = when (val garbageCollectorSettings = cacheSettings.garbaseCollectorSettings) {
9495
is MemoryGarbageCollectorSettings.Eager -> memoryEagerGarbageCollector()
9596
is MemoryGarbageCollectorSettings.LRUGC -> memoryLruGarbageCollector(json("cacheSizeBytes" to garbageCollectorSettings.sizeBytes))
9697
}
97-
memoryLocalCache(json("garbageCollector" to garbageCollecorSettings).asDynamic() as MemoryCacheSettings)
98+
memoryLocalCache(json("garbageCollector" to garbageCollectorSettings).asDynamic() as MemoryCacheSettings)
9899
}
99100
})
100101
}
@@ -138,15 +139,19 @@ actual class FirebaseFirestoreException(cause: Throwable, val code: FirestoreExc
138139
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
139140
actual val FirebaseFirestoreException.code: FirestoreExceptionCode get() = code
140141

141-
actual class QuerySnapshot(val js: JsQuerySnapshot) {
142+
val QuerySnapshot.js: JsQuerySnapshot get() = js
143+
144+
actual class QuerySnapshot(internal val js: JsQuerySnapshot) {
142145
actual val documents
143146
get() = js.docs.map { DocumentSnapshot(NativeDocumentSnapshotWrapper(it)) }
144147
actual val documentChanges
145148
get() = js.docChanges().map { DocumentChange(it) }
146149
actual val metadata: SnapshotMetadata get() = SnapshotMetadata(js.metadata)
147150
}
148151

149-
actual class DocumentChange(val js: JsDocumentChange) {
152+
val DocumentChange.js: JsDocumentChange get() = js
153+
154+
actual class DocumentChange(internal val js: JsDocumentChange) {
150155
actual val document: DocumentSnapshot
151156
get() = DocumentSnapshot(NativeDocumentSnapshotWrapper(js.doc))
152157
actual val newIndex: Int
@@ -161,12 +166,16 @@ actual data class NativeDocumentSnapshot(val js: JsDocumentSnapshot)
161166

162167
val DocumentSnapshot.js get() = native.js
163168

164-
actual class SnapshotMetadata(val js: JsSnapshotMetadata) {
169+
val SnapshotMetadata.js get() = js
170+
171+
actual class SnapshotMetadata(internal val js: JsSnapshotMetadata) {
165172
actual val hasPendingWrites: Boolean get() = js.hasPendingWrites
166173
actual val isFromCache: Boolean get() = js.fromCache
167174
}
168175

169-
actual class FieldPath private constructor(val js: JsFieldPath) {
176+
val FieldPath.js get() = js
177+
178+
actual class FieldPath private constructor(internal val js: JsFieldPath) {
170179

171180
actual companion object {
172181
actual val documentId = FieldPath(jsDocumentId())

0 commit comments

Comments
 (0)