From 5ccdb7858ebc27f6394af5c48526fcde35cb72f9 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Fri, 7 Aug 2026 16:22:39 +0200 Subject: [PATCH] chore: mark non-public declarations @internal The capability matrix extractor treats every non-underscore name in lib/ as public API, without following exports. Plenty of implementation plumbing in lib/src/ therefore counted as public surface that had to be either registered in sdk-compliance.yaml or left as an unexplained gap. @internal is the marker the extractor already honours for exactly this case, and the repo already uses it on members; this extends it to the declarations themselves. Annotates 24 declarations that are public by Dart's underscore rule but are not reachable from their package's public library: HTTP plumbing (GotrueFetch, Fetch, AuthHttpClient, GotrueRequestOptions, RequestMethodType, ApiVersion), realtime transport internals (Push, Hook, Message, Serializer, RetryTimer and their typedefs), per-package Constants, and a few helpers (Counter, ToQueryParams, SupabaseAuth, the admin OAuth client response wrappers). Deliberately excluded: anything with symbols registered in sdk-compliance.yaml as capability evidence, since annotating those would hide them from the extractor and break the drift check. That ruled out StorageBucketApi, GoTrueAdminOAuthApi, GoTrueAdminCustomProvidersApi, GoTrueAdminMFAApi, realtime's Constants and ChannelFilter. Also excluded File and YAJsonIsolate, which are reachable publicly via conditional imports and exports. functions_client gains a meta dependency, which it did not previously have. Reported public surface drops from 1952 symbols to 1831. --- packages/functions_client/lib/src/constants.dart | 2 ++ packages/functions_client/pubspec.yaml | 1 + packages/gotrue/lib/src/constants.dart | 1 + packages/gotrue/lib/src/fetch.dart | 2 ++ packages/gotrue/lib/src/gotrue_admin_oauth_api.dart | 3 +++ packages/gotrue/lib/src/types/api_version.dart | 2 ++ packages/gotrue/lib/src/types/fetch_options.dart | 2 ++ packages/realtime_client/lib/src/message.dart | 2 ++ packages/realtime_client/lib/src/push.dart | 4 ++++ packages/realtime_client/lib/src/retry_timer.dart | 3 +++ packages/realtime_client/lib/src/serializer.dart | 2 ++ packages/storage_client/lib/src/constants.dart | 2 ++ packages/storage_client/lib/src/fetch.dart | 1 + packages/storage_client/lib/src/types.dart | 1 + packages/supabase/lib/src/auth_http_client.dart | 2 ++ packages/supabase/lib/src/constants.dart | 2 ++ packages/supabase/lib/src/counter.dart | 3 +++ packages/supabase_flutter/lib/src/constants.dart | 2 ++ packages/supabase_flutter/lib/src/supabase_auth.dart | 2 ++ 19 files changed, 39 insertions(+) diff --git a/packages/functions_client/lib/src/constants.dart b/packages/functions_client/lib/src/constants.dart index 3b32d1435..451132ae5 100644 --- a/packages/functions_client/lib/src/constants.dart +++ b/packages/functions_client/lib/src/constants.dart @@ -1,6 +1,8 @@ import 'package:functions_client/src/version.dart'; import 'package:supabase_common/supabase_common.dart'; +import 'package:meta/meta.dart'; +@internal class Constants { static final defaultHeaders = { 'X-Client-Info': buildClientInfoHeader('functions-dart', version), diff --git a/packages/functions_client/pubspec.yaml b/packages/functions_client/pubspec.yaml index 4ad213986..9f856980f 100644 --- a/packages/functions_client/pubspec.yaml +++ b/packages/functions_client/pubspec.yaml @@ -20,6 +20,7 @@ resolution: workspace dependencies: http: ^1.6.0 logging: ^1.3.0 + meta: ^1.16.0 supabase_common: 0.1.2 yet_another_json_isolate: 2.1.1 diff --git a/packages/gotrue/lib/src/constants.dart b/packages/gotrue/lib/src/constants.dart index ba667b742..8b060c1c1 100644 --- a/packages/gotrue/lib/src/constants.dart +++ b/packages/gotrue/lib/src/constants.dart @@ -3,6 +3,7 @@ import 'package:gotrue/src/version.dart'; import 'package:meta/meta.dart'; import 'package:supabase_common/supabase_common.dart'; +@internal class Constants { static const String defaultGotrueUrl = 'http://localhost:9999'; static final Map defaultHeaders = { diff --git a/packages/gotrue/lib/src/fetch.dart b/packages/gotrue/lib/src/fetch.dart index 4769a5b97..4825b3b91 100644 --- a/packages/gotrue/lib/src/fetch.dart +++ b/packages/gotrue/lib/src/fetch.dart @@ -10,8 +10,10 @@ import 'package:http/http.dart'; import 'package:meta/meta.dart'; import 'package:supabase_common/supabase_common.dart'; +@internal enum RequestMethodType { get, post, put, patch, delete } +@internal class GotrueFetch { final Client? httpClient; diff --git a/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart b/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart index 4c5303afd..7be5d78b4 100644 --- a/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart +++ b/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart @@ -2,9 +2,11 @@ import 'fetch.dart'; import 'helper.dart'; import 'types/fetch_options.dart'; import 'types/types.dart'; +import 'package:meta/meta.dart'; /// Response type for OAuth client operations. /// Only relevant when the OAuth 2.1 server is enabled in Supabase Auth. +@internal class OAuthClientResponse { final OAuthClient? client; @@ -19,6 +21,7 @@ class OAuthClientResponse { /// Response type for listing OAuth clients. /// Only relevant when the OAuth 2.1 server is enabled in Supabase Auth. +@internal class OAuthClientListResponse { final List clients; final String? aud; diff --git a/packages/gotrue/lib/src/types/api_version.dart b/packages/gotrue/lib/src/types/api_version.dart index b3b9840f0..0806a9581 100644 --- a/packages/gotrue/lib/src/types/api_version.dart +++ b/packages/gotrue/lib/src/types/api_version.dart @@ -1,5 +1,6 @@ import 'package:gotrue/src/constants.dart'; import 'package:http/http.dart'; +import 'package:meta/meta.dart'; // Parses the API version which is 2YYY-MM-DD. */ const String _apiVersionRegex = @@ -8,6 +9,7 @@ const String _apiVersionRegex = /// Represents the API versions supported by the package. /// Represents the API version specified by a [name] in the format YYYY-MM-DD. +@internal class ApiVersion { const ApiVersion({ required this.name, diff --git a/packages/gotrue/lib/src/types/fetch_options.dart b/packages/gotrue/lib/src/types/fetch_options.dart index 733f33ef3..fb49c8e2c 100644 --- a/packages/gotrue/lib/src/types/fetch_options.dart +++ b/packages/gotrue/lib/src/types/fetch_options.dart @@ -1,7 +1,9 @@ import 'package:supabase_common/supabase_common.dart'; +import 'package:meta/meta.dart'; export 'package:supabase_common/supabase_common.dart' show FetchOptions; +@internal class GotrueRequestOptions extends FetchOptions { final String? jwt; final String? redirectTo; diff --git a/packages/realtime_client/lib/src/message.dart b/packages/realtime_client/lib/src/message.dart index 39e2ee2d9..8a54dcc51 100644 --- a/packages/realtime_client/lib/src/message.dart +++ b/packages/realtime_client/lib/src/message.dart @@ -1,6 +1,8 @@ import 'package:realtime_client/realtime_client.dart'; import 'package:realtime_client/src/constants.dart'; +import 'package:meta/meta.dart'; +@internal class Message { final String topic; final ChannelEvent event; diff --git a/packages/realtime_client/lib/src/push.dart b/packages/realtime_client/lib/src/push.dart index 801c95f6d..e5752a32d 100644 --- a/packages/realtime_client/lib/src/push.dart +++ b/packages/realtime_client/lib/src/push.dart @@ -4,12 +4,15 @@ import 'package:realtime_client/realtime_client.dart'; import 'package:realtime_client/src/constants.dart'; import 'package:realtime_client/src/message.dart'; import 'package:realtime_client/src/types.dart'; +import 'package:meta/meta.dart'; +@internal typedef Callback = void Function(dynamic response); /// {@template push} /// Initializes the Push /// {@endtemplate} +@internal class Push { bool sent = false; Timer? _timeoutTimer; @@ -139,6 +142,7 @@ class Push { } } +@internal class Hook { final String status; final Callback callback; diff --git a/packages/realtime_client/lib/src/retry_timer.dart b/packages/realtime_client/lib/src/retry_timer.dart index de84aaef4..996591e52 100644 --- a/packages/realtime_client/lib/src/retry_timer.dart +++ b/packages/realtime_client/lib/src/retry_timer.dart @@ -2,7 +2,9 @@ import 'dart:async'; import 'package:meta/meta.dart'; +@internal typedef TimerCallback = void Function(); +@internal typedef TimerCalculation = int Function(int tries); // Need to limit doubling to avoid overflow, this limit gives 1 million times @@ -26,6 +28,7 @@ const maxShift = 20; /// reconnectTimer.scheduleTimeout(); // fires after 1000 /// /// ``` +@internal class RetryTimer { final TimerCallback callback; final TimerCalculation timerCalc; diff --git a/packages/realtime_client/lib/src/serializer.dart b/packages/realtime_client/lib/src/serializer.dart index 707f08d36..c4096e88f 100644 --- a/packages/realtime_client/lib/src/serializer.dart +++ b/packages/realtime_client/lib/src/serializer.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:meta/meta.dart'; /// Encodes and decodes Realtime protocol `2.0.0` frames. /// @@ -12,6 +13,7 @@ import 'dart:typed_data'; /// WebSocket frames so that raw bytes can be forwarded without JSON encoding. /// Incoming binary broadcast frames are decoded back into the same map shape as /// their JSON counterparts. +@internal class Serializer { static const int headerLength = 1; static const int userBroadcastPushMetaLength = 6; diff --git a/packages/storage_client/lib/src/constants.dart b/packages/storage_client/lib/src/constants.dart index d399ad15c..1159663ee 100644 --- a/packages/storage_client/lib/src/constants.dart +++ b/packages/storage_client/lib/src/constants.dart @@ -1,6 +1,8 @@ import 'package:storage_client/src/version.dart'; import 'package:supabase_common/supabase_common.dart'; +import 'package:meta/meta.dart'; +@internal class Constants { static final Map defaultHeaders = { 'X-Client-Info': buildClientInfoHeader('storage-dart', version), diff --git a/packages/storage_client/lib/src/fetch.dart b/packages/storage_client/lib/src/fetch.dart index 19d6ba45b..c352ec95d 100644 --- a/packages/storage_client/lib/src/fetch.dart +++ b/packages/storage_client/lib/src/fetch.dart @@ -12,6 +12,7 @@ import 'package:supabase_common/supabase_common.dart'; import 'file_stub.dart' if (dart.library.io) './file_io.dart'; +@internal class Fetch { final Client? httpClient; final _log = Logger('supabase.storage'); diff --git a/packages/storage_client/lib/src/types.dart b/packages/storage_client/lib/src/types.dart index f92dc8b61..398ed3e0b 100644 --- a/packages/storage_client/lib/src/types.dart +++ b/packages/storage_client/lib/src/types.dart @@ -677,6 +677,7 @@ class TransformOptions { }); } +@internal extension ToQueryParams on TransformOptions { Map get toQueryParams { return { diff --git a/packages/supabase/lib/src/auth_http_client.dart b/packages/supabase/lib/src/auth_http_client.dart index f010845c0..75217b290 100644 --- a/packages/supabase/lib/src/auth_http_client.dart +++ b/packages/supabase/lib/src/auth_http_client.dart @@ -1,6 +1,8 @@ import 'package:http/http.dart'; import 'package:supabase/src/api_key.dart'; +import 'package:meta/meta.dart'; +@internal class AuthHttpClient extends BaseClient { final Client _inner; diff --git a/packages/supabase/lib/src/constants.dart b/packages/supabase/lib/src/constants.dart index b0f598916..beb419188 100644 --- a/packages/supabase/lib/src/constants.dart +++ b/packages/supabase/lib/src/constants.dart @@ -1,6 +1,8 @@ import 'package:supabase/src/version.dart'; import 'package:supabase_common/supabase_common.dart'; +import 'package:meta/meta.dart'; +@internal class Constants { static final Map defaultHeaders = Map.unmodifiable({ 'X-Client-Info': buildClientInfoHeader( diff --git a/packages/supabase/lib/src/counter.dart b/packages/supabase/lib/src/counter.dart index 8affec1e1..cdd60aed1 100644 --- a/packages/supabase/lib/src/counter.dart +++ b/packages/supabase/lib/src/counter.dart @@ -1,3 +1,6 @@ +import 'package:meta/meta.dart'; + +@internal class Counter { int _value = 0; diff --git a/packages/supabase_flutter/lib/src/constants.dart b/packages/supabase_flutter/lib/src/constants.dart index 8ea5c0649..ef34d362d 100644 --- a/packages/supabase_flutter/lib/src/constants.dart +++ b/packages/supabase_flutter/lib/src/constants.dart @@ -1,6 +1,8 @@ import 'package:supabase_common/supabase_common.dart'; import 'package:supabase_flutter/src/version.dart'; +import 'package:meta/meta.dart'; +@internal class Constants { static final Map defaultHeaders = Map.unmodifiable({ 'X-Client-Info': buildClientInfoHeader( diff --git a/packages/supabase_flutter/lib/src/supabase_auth.dart b/packages/supabase_flutter/lib/src/supabase_auth.dart index 116e2b4f6..6d9450dfc 100644 --- a/packages/supabase_flutter/lib/src/supabase_auth.dart +++ b/packages/supabase_flutter/lib/src/supabase_auth.dart @@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart' import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; +import 'package:meta/meta.dart'; import 'package:supabase_common/supabase_common.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -55,6 +56,7 @@ import 'clear_auth_url_parameters_stub.dart' /// only the URL the app was loaded with is inspected once at startup, /// since browser navigation triggers a full page load rather than a /// stream event. +@internal class SupabaseAuth with WidgetsBindingObserver { static WidgetsBinding get _widgetsBindingInstance => WidgetsBinding.instance;