From c6d8f8b9e3465beb7d5344cc482b27be39873fad Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 28 Oct 2025 14:49:44 +0000 Subject: [PATCH 1/3] fix(database, web): more explicit interop types --- .../src/interop/data_snapshot_interop.dart | 7 +-- .../lib/src/interop/database_interop.dart | 53 ++++++------------- .../lib/src/interop/query_interop.dart | 6 +-- .../lib/src/interop/reference_interop.dart | 12 +---- 4 files changed, 20 insertions(+), 58 deletions(-) diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/data_snapshot_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/data_snapshot_interop.dart index b36970b0477a..6dbe63f22766 100644 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/data_snapshot_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/data_snapshot_interop.dart @@ -4,12 +4,7 @@ part of 'database_interop.dart'; -@JS('DataSnapshot') -@staticInterop -@anonymous -abstract class DataSnapshotJsImpl {} - -extension DataSnapshotJsImpl$ on DataSnapshotJsImpl { +extension type DataSnapshotJsImpl._(JSObject _) implements JSObject { external JSString? get key; external JSAny? /* JSString | num | null*/ get priority; diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart index 2a3bcec22451..69ec2dfada6a 100755 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart @@ -50,7 +50,7 @@ external void forceWebSockets(); @JS() @staticInterop -external JSPromise /*DataSnapshotJsImpl*/ get(QueryJsImpl query); +external JSPromise get(QueryJsImpl query); @JS() @staticInterop @@ -164,13 +164,13 @@ external ReferenceJsImpl refFromURL( @JS() @staticInterop -external JSPromise remove( +external JSPromise remove( ReferenceJsImpl ref, ); @JS() @staticInterop -external JSPromise/**/ runTransaction( +external JSPromise runTransaction( ReferenceJsImpl ref, JSFunction transactionUpdate, // Function(JSAny currentData) transactionUpdate, @@ -183,16 +183,16 @@ external JSAny serverTimestamp(); @JS() @staticInterop -external JSPromise set(ReferenceJsImpl ref, JSAny? value); +external JSPromise set(ReferenceJsImpl ref, JSAny? value); @JS() @staticInterop -external JSPromise setPriority( +external JSPromise setPriority( ReferenceJsImpl ref, /* JSString | JSNumber | null */ JSAny? priority); @JS() @staticInterop -external JSPromise setWithPriority(ReferenceJsImpl ref, JSAny? value, +external JSPromise setWithPriority(ReferenceJsImpl ref, JSAny? value, /* JSString | JSNumber | null */ JSAny? priority); @JS() @@ -220,60 +220,44 @@ abstract class ServerValue { external static JSAny get TIMESTAMP; } -@JS('Database') -@staticInterop -abstract class DatabaseJsImpl {} - -extension DatabaseJsImplExtension on DatabaseJsImpl { +extension type DatabaseJsImpl._(JSObject _) implements JSObject { external AppJsImpl get app; external set app(AppJsImpl a); external JSString get type; } -@JS('QueryConstraint') -@staticInterop -abstract class QueryConstraintJsImpl {} - -extension QueryConstraintJsImplExtension on QueryConstraintJsImpl { +extension type QueryConstraintJsImpl._(JSObject _) implements JSObject { external JSString get type; } -@JS('OnDisconnect') -@staticInterop -abstract class OnDisconnectJsImpl {} - -extension OnDisconnectJsImplExtension on OnDisconnectJsImpl { - external JSPromise cancel([ +extension type OnDisconnectJsImpl._(JSObject _) implements JSObject { + external JSPromise cancel([ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise remove([ + external JSPromise remove([ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise set( + external JSPromise set( JSAny? value, [ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise setWithPriority( + external JSPromise setWithPriority( JSAny? value, JSAny? priority, ); - external JSPromise update( + external JSPromise update( JSAny? values, ); } -@JS('ThenableReference') -@staticInterop -abstract class ThenableReferenceJsImpl extends ReferenceJsImpl {} - -extension ThenableReferenceJsImplExtension on ThenableReferenceJsImpl { +extension type ThenableReferenceJsImpl._(JSObject _) implements JSObject { external JSPromise then([JSFunction? onResolve, JSFunction? onReject]); } @@ -302,12 +286,7 @@ abstract class ListenOptions { external static JSBoolean get onlyOnce; } -@JS() -@staticInterop -@anonymous -abstract class FirebaseError {} - -extension FirebaseErrorExtension on FirebaseError { +extension type FirebaseError._(JSObject _) implements JSObject { external JSString get code; external JSString get message; external JSString get name; diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/query_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/query_interop.dart index c88f4bfe14c9..e38735898f0b 100644 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/query_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/query_interop.dart @@ -4,11 +4,7 @@ part of 'database_interop.dart'; -@JS('Query') -@staticInterop -abstract class QueryJsImpl {} - -extension ExtensionQueryJsImpl on QueryJsImpl { +extension type QueryJsImpl._(JSObject _) implements JSObject { external ReferenceJsImpl get ref; external JSBoolean isEqual(QueryJsImpl other); diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart index fa4adeadf0ec..811a151209a6 100644 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart @@ -4,21 +4,13 @@ part of 'database_interop.dart'; -@JS('TransactionResult') -@staticInterop -abstract class TransactionResultJsImpl {} - -extension TransactionResultJsImplExtension on TransactionResultJsImpl { +extension type TransactionResultJsImpl._(JSObject _) implements JSObject { external JSObject toJSON(); external JSBoolean get committed; external DataSnapshotJsImpl get snapshot; } -@JS('DatabaseReference') -@staticInterop -abstract class ReferenceJsImpl extends QueryJsImpl {} - -extension ReferenceJsImplExtension on ReferenceJsImpl { +extension type ReferenceJsImpl._(JSObject _) implements JSObject { external JSString? get key; external ReferenceJsImpl? get parent; From 79b887d8e04da1be23d8e3f8dc645ded74a20723 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 28 Oct 2025 15:18:21 +0000 Subject: [PATCH 2/3] fix: interop types --- .../lib/src/interop/database.dart | 30 ++++++++----------- .../lib/src/interop/database_interop.dart | 19 ++++++------ .../lib/src/interop/reference_interop.dart | 3 +- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/database.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/database.dart index f616f00b1852..dd83d80f2314 100755 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/database.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/database.dart @@ -78,8 +78,7 @@ class Database /// can be used for reading or writing data to that database location. /// /// See: . -class DatabaseReference - extends Query { +class DatabaseReference extends Query { static final _expando = Expando(); /// The last part of the current path. @@ -204,11 +203,9 @@ class DatabaseReference applyLocally: applyLocally.toJS), ) .toDart; - final castedJsTransaction = - jsTransactionResult as database_interop.TransactionResultJsImpl; return Transaction( - committed: (castedJsTransaction.committed).toDart, - snapshot: DataSnapshot._fromJsObject(castedJsTransaction.snapshot), + committed: (jsTransactionResult.committed).toDart, + snapshot: DataSnapshot._fromJsObject(jsTransactionResult.snapshot), ); } catch (e, s) { throw convertFirebaseDatabaseException(e, s); @@ -317,8 +314,7 @@ class Query extends JsObjectWrapper { final jsSnapshotPromise = database_interop.get(jsObject); final snapshot = await jsSnapshotPromise.toDart; - return DataSnapshot.getInstance( - snapshot as database_interop.DataSnapshotJsImpl); + return DataSnapshot.getInstance(snapshot); } /// Returns a Query with the ending point [value]. The ending point @@ -674,18 +670,18 @@ class OnDisconnect /// [Future] property. /// /// See: . -class ThenableReference - extends DatabaseReference { - late final Future _future = jsObject - .then(((database_interop.ReferenceJsImpl reference) { - DatabaseReference.getInstance(reference); - }).toJS) - .toDart - .then((value) => value as DatabaseReference); +class ThenableReference extends DatabaseReference { + late final Future _future = + (jsObject as database_interop.ThenableReferenceJsImpl) + .then(((database_interop.ReferenceJsImpl reference) { + DatabaseReference.getInstance(reference); + }).toJS) + .toDart + .then((value) => value as DatabaseReference); /// Creates a new ThenableReference from a [jsObject]. ThenableReference.fromJsObject( - super.jsObject, + database_interop.ThenableReferenceJsImpl super.jsObject, ) : super._fromJsObject(); /// A Future property. diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart index 69ec2dfada6a..af438b5d52d2 100755 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/database_interop.dart @@ -183,16 +183,16 @@ external JSAny serverTimestamp(); @JS() @staticInterop -external JSPromise set(ReferenceJsImpl ref, JSAny? value); +external JSPromise set(ReferenceJsImpl ref, JSAny? value); @JS() @staticInterop -external JSPromise setPriority( +external JSPromise setPriority( ReferenceJsImpl ref, /* JSString | JSNumber | null */ JSAny? priority); @JS() @staticInterop -external JSPromise setWithPriority(ReferenceJsImpl ref, JSAny? value, +external JSPromise setWithPriority(ReferenceJsImpl ref, JSAny? value, /* JSString | JSNumber | null */ JSAny? priority); @JS() @@ -231,33 +231,34 @@ extension type QueryConstraintJsImpl._(JSObject _) implements JSObject { } extension type OnDisconnectJsImpl._(JSObject _) implements JSObject { - external JSPromise cancel([ + external JSPromise cancel([ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise remove([ + external JSPromise remove([ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise set( + external JSPromise set( JSAny? value, [ JSFunction onComplete, //void Function(JSAny) onComplete ]); - external JSPromise setWithPriority( + external JSPromise setWithPriority( JSAny? value, JSAny? priority, ); - external JSPromise update( + external JSPromise update( JSAny? values, ); } -extension type ThenableReferenceJsImpl._(JSObject _) implements JSObject { +extension type ThenableReferenceJsImpl._(JSObject _) + implements JSObject, ReferenceJsImpl { external JSPromise then([JSFunction? onResolve, JSFunction? onReject]); } diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart index 811a151209a6..c70b6aec2b9a 100644 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart @@ -10,7 +10,8 @@ extension type TransactionResultJsImpl._(JSObject _) implements JSObject { external DataSnapshotJsImpl get snapshot; } -extension type ReferenceJsImpl._(JSObject _) implements JSObject { +extension type ReferenceJsImpl._(JSObject _) + implements JSObject, QueryJsImpl { external JSString? get key; external ReferenceJsImpl? get parent; From 38f048cc7b15e976427fa0757469634b53eb5eab Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 28 Oct 2025 15:34:39 +0000 Subject: [PATCH 3/3] fix: format --- .../lib/src/interop/reference_interop.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart index c70b6aec2b9a..c8998784e14f 100644 --- a/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart +++ b/packages/firebase_database/firebase_database_web/lib/src/interop/reference_interop.dart @@ -10,8 +10,7 @@ extension type TransactionResultJsImpl._(JSObject _) implements JSObject { external DataSnapshotJsImpl get snapshot; } -extension type ReferenceJsImpl._(JSObject _) - implements JSObject, QueryJsImpl { +extension type ReferenceJsImpl._(JSObject _) implements JSObject, QueryJsImpl { external JSString? get key; external ReferenceJsImpl? get parent;