diff --git a/CHANGELOG.md b/CHANGELOG.md index 63cc736..8df1b64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.0.1-dev.10] + +- chore: migrate to null-safety + ## [0.0.1-dev.9] - fix: rpc to return PostgrestTransformBuilder diff --git a/example/main.dart b/example/main.dart index be59c81..f2461f7 100644 --- a/example/main.dart +++ b/example/main.dart @@ -1,6 +1,6 @@ import 'package:supabase/supabase.dart'; -void main() async { +Future main() async { const supabaseUrl = ''; const supabaseKey = ''; final client = SupabaseClient(supabaseUrl, supabaseKey); @@ -19,13 +19,13 @@ void main() async { final subscription1 = client.from('countries').on(SupabaseEventTypes.delete, (x) { print('on countries.delete: ${x.table} ${x.eventType} ${x.oldRecord}'); - }).subscribe((String event, {String errorMsg}) { + }).subscribe((String event, {String? errorMsg}) { print('event: $event error: $errorMsg'); }); final subscription2 = client.from('todos').on(SupabaseEventTypes.insert, (x) { print('on todos.insert: ${x.table} ${x.eventType} ${x.newRecord}'); - }).subscribe((String event, {String errorMsg}) { + }).subscribe((String event, {String? errorMsg}) { print('event: $event error: $errorMsg'); }); diff --git a/lib/src/auth_user.dart b/lib/src/auth_user.dart index 43c8c70..d5646d2 100644 --- a/lib/src/auth_user.dart +++ b/lib/src/auth_user.dart @@ -2,16 +2,16 @@ import 'package:gotrue/gotrue.dart' show User; class AuthUser extends User { AuthUser( - {String id, - Map appMetadata, - Map userMetadata, - String aud, - String email, - String createdAt, - String confirmedAt, - String lastSignInAt, - String role, - String updatedAt}) + {required String id, + required Map appMetadata, + required Map userMetadata, + required String aud, + required String email, + required String createdAt, + String? confirmedAt, + String? lastSignInAt, + required String role, + required String updatedAt}) : super( id: id, appMetadata: appMetadata, diff --git a/lib/src/supabase.dart b/lib/src/supabase.dart index eb3c100..81484b3 100644 --- a/lib/src/supabase.dart +++ b/lib/src/supabase.dart @@ -7,26 +7,22 @@ import 'package:realtime_client/realtime_client.dart'; import 'supabase_query_builder.dart'; class SupabaseClient { - String supabaseUrl; - String supabaseKey; - String schema; - String restUrl; - String realtimeUrl; - String authUrl; + final String supabaseUrl; + final String supabaseKey; + final String schema; + final String restUrl; + final String realtimeUrl; + final String authUrl; - GoTrueClient auth; - RealtimeClient realtime; + late final GoTrueClient auth; + late final RealtimeClient realtime; SupabaseClient(this.supabaseUrl, this.supabaseKey, - {String schema, bool autoRefreshToken = true}) { - if (supabaseUrl == null) throw 'supabaseUrl is required.'; - if (supabaseKey == null) throw 'supabaseKey is required.'; - - restUrl = '$supabaseUrl/rest/v1'; - realtimeUrl = '$supabaseUrl/realtime/v1'.replaceAll('http', 'ws'); - authUrl = '$supabaseUrl/auth/v1'; - schema = schema ?? 'public'; - + {String? schema, bool autoRefreshToken = true}) + : restUrl = '$supabaseUrl/rest/v1', + realtimeUrl = '$supabaseUrl/realtime/v1'.replaceAll('http', 'ws'), + authUrl = '$supabaseUrl/auth/v1', + schema = schema ?? 'public' { auth = _initSupabaseAuthClient(autoRefreshToken: autoRefreshToken); realtime = _initRealtimeClient(); } @@ -44,7 +40,7 @@ class SupabaseClient { } /// Perform a stored procedure call. - PostgrestTransformBuilder rpc(String fn, {Map params}) { + PostgrestTransformBuilder rpc(String fn, {Map? params}) { final rest = _initPostgRESTClient(); return rest.rpc(fn, params: params); } @@ -54,8 +50,8 @@ class SupabaseClient { final completer = Completer(); await _closeSubscription(subscription); - final openSubscriptions = getSubscriptions()?.length; - if (openSubscriptions == null || openSubscriptions == 0) { + final openSubscriptions = getSubscriptions().length; + if (openSubscriptions == 0) { realtime.disconnect(); } completer.complete(openSubscriptions); @@ -68,7 +64,7 @@ class SupabaseClient { return realtime.channels; } - GoTrueClient _initSupabaseAuthClient({bool autoRefreshToken}) { + GoTrueClient _initSupabaseAuthClient({bool? autoRefreshToken}) { return GoTrueClient( url: authUrl, headers: { diff --git a/lib/src/supabase_query_builder.dart b/lib/src/supabase_query_builder.dart index 7491d40..459ad1e 100644 --- a/lib/src/supabase_query_builder.dart +++ b/lib/src/supabase_query_builder.dart @@ -8,11 +8,11 @@ import 'supabase_realtime_payload.dart'; typedef Callback = void Function(SupabaseRealtimePayload payload); class SupabaseQueryBuilder extends PostgrestQueryBuilder { - SupabaseRealtimeClient _subscription; - RealtimeClient _realtime; + late final SupabaseRealtimeClient _subscription; + late final RealtimeClient _realtime; SupabaseQueryBuilder(String url, RealtimeClient realtime, - {Map headers = const {}, String schema, String table}) + {Map headers = const {}, String? schema, String? table}) : super(url, headers: headers, schema: schema) { _subscription = SupabaseRealtimeClient(realtime, schema ?? 'public', table ?? '*'); diff --git a/lib/src/supabase_realtime_client.dart b/lib/src/supabase_realtime_client.dart index 4be3fcd..303221a 100644 --- a/lib/src/supabase_realtime_client.dart +++ b/lib/src/supabase_realtime_client.dart @@ -5,10 +5,10 @@ import 'supabase_realtime_payload.dart'; typedef Callback = void Function(SupabaseRealtimePayload payload); -typedef SubscribeCallback = void Function(String event, {String errorMsg}); +typedef SubscribeCallback = void Function(String event, {String? errorMsg}); class SupabaseRealtimeClient { - RealtimeSubscription subscription; + late final RealtimeSubscription subscription; SupabaseRealtimeClient( RealtimeClient socket, String schema, String tableName) { @@ -31,15 +31,18 @@ class SupabaseRealtimeClient { } /// Enables the subscription. - RealtimeSubscription subscribe([SubscribeCallback callback]) { - subscription.onError((e) => callback('SUBSCRIPTION_ERROR', errorMsg: e)); - subscription.onClose(() => callback('CLOSED')); + RealtimeSubscription subscribe([SubscribeCallback? callback]) { + subscription + .onError((e) => callback?.call('SUBSCRIPTION_ERROR', errorMsg: e)); + subscription.onClose(() => callback?.call('CLOSED')); subscription .subscribe() - .receive('ok', (_) => callback('SUBSCRIBED')) - .receive('error', - (res) => callback('SUBSCRIPTION_ERROR', errorMsg: res.toString())) - .receive('timeout', (_) => callback('RETRYING_AFTER_TIMEOUT')); + .receive('ok', (_) => callback?.call('SUBSCRIBED')) + .receive( + 'error', + (res) => + callback?.call('SUBSCRIPTION_ERROR', errorMsg: res.toString())) + .receive('timeout', (_) => callback?.call('RETRYING_AFTER_TIMEOUT')); return subscription; } } diff --git a/lib/src/supabase_realtime_payload.dart b/lib/src/supabase_realtime_payload.dart index c589c45..450955c 100644 --- a/lib/src/supabase_realtime_payload.dart +++ b/lib/src/supabase_realtime_payload.dart @@ -1,49 +1,56 @@ import 'package:realtime_client/realtime_client.dart'; class SupabaseRealtimePayload { - String commitTimestamp; + final String commitTimestamp; /// 'INSERT' | 'UPDATE' | 'DELETE' - String eventType; - String schema; - String table; + final String eventType; + final String schema; + final String table; /// The new record. Present for 'INSERT' and 'UPDATE' events - dynamic newRecord; + final dynamic newRecord; /// The previous record. Present for 'UPDATE' and 'DELETE' events - dynamic oldRecord; + final dynamic oldRecord; - SupabaseRealtimePayload( - {this.commitTimestamp, - this.eventType, - this.schema, - this.table, - this.newRecord, - this.oldRecord}); + SupabaseRealtimePayload({ + required this.commitTimestamp, + required this.eventType, + required this.schema, + required this.table, + required this.newRecord, + required this.oldRecord, + }); factory SupabaseRealtimePayload.fromJson(Map json) { - final obj = SupabaseRealtimePayload(); - obj.schema = json['schema'] as String; - obj.table = json['table'] as String; - obj.commitTimestamp = json['commit_timestamp'] as String; - obj.eventType = json['type'] as String; - + final schema = json['schema'] as String; + final table = json['table'] as String; + final commitTimestamp = json['commit_timestamp'] as String; + final eventType = json['type'] as String; + Map? newRecord; if (json['type'] == 'INSERT' || json['type'] == 'UPDATE') { - final columns = obj.convertColumnList(json['columns'] as List); - final records = json['record'] as Map ?? {}; - obj.newRecord = convertChangeData(columns, records); + final columns = convertColumnList(json['columns'] as List?); + final records = json['record'] as Map? ?? {}; + newRecord = convertChangeData(columns, records); } - + Map? oldRecord; if (json['type'] == 'UPDATE' || json['type'] == 'DELETE') { - final columns = obj.convertColumnList(json['columns'] as List); - final records = json['old_record'] as Map ?? {}; - obj.oldRecord = convertChangeData(columns, records); + final columns = convertColumnList(json['columns'] as List?); + final records = json['old_record'] as Map? ?? {}; + oldRecord = convertChangeData(columns, records); } - return obj; + return SupabaseRealtimePayload( + table: table, + schema: schema, + commitTimestamp: commitTimestamp, + eventType: eventType, + newRecord: newRecord, + oldRecord: oldRecord, + ); } - List> convertColumnList(List columns) { + static List> convertColumnList(List? columns) { final result = >[]; if (columns != null) { for (final column in columns) { diff --git a/pubspec.yaml b/pubspec.yaml index 7f52506..bc3c7fc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,17 +1,17 @@ name: supabase description: A dart client for Supabase. This client makes it simple for developers to build secure and scalable products. -version: 0.0.1-dev.9 +version: 0.0.1-dev.10 homepage: "https://supabase.io" repository: "https://github.com/supabase/supabase-dart" environment: - sdk: ">=2.8.1 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: - gotrue: ^0.0.1-dev.7 - postgrest: ^0.0.7 - realtime_client: ^0.0.7 + gotrue: ^0.0.1-dev.9 + postgrest: ^0.0.8 + realtime_client: ^0.0.8 dev_dependencies: - test: ^1.15.4 - lint: ^1.3.0 + lint: ^1.5.2 + test: ^1.16.5 diff --git a/test/client_test.dart b/test/client_test.dart index a4c1039..3e0a728 100644 --- a/test/client_test.dart +++ b/test/client_test.dart @@ -4,7 +4,7 @@ import 'package:test/test.dart'; void main() { const supabaseUrl = ''; const supabaseKey = ''; - SupabaseClient client; + late SupabaseClient client; setUp(() { client = SupabaseClient(supabaseUrl, supabaseKey);