From 2c24c4bb5a8c1eae3fd8bdcea82c8fcae43d1233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Thu, 21 Dec 2023 23:20:25 +0100 Subject: [PATCH 01/15] feat: add support for sync openUrl --- auth0_flutter/lib/auth0_flutter_web.dart | 5 +++++ auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart | 6 ++++-- auth0_flutter/lib/src/web/js_interop.dart | 8 ++++++-- .../lib/src/auth0_flutter_web_platform.dart | 1 + .../lib/src/login_options.dart | 3 +++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index cd9e50859..1ed0f926f 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -1,4 +1,5 @@ import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; + import 'src/version.dart'; export 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart' @@ -101,6 +102,8 @@ class Auth0Web { /// * Arbitrary [parameters] can be specified and then picked up in a custom /// Auth0 [Action](https://auth0.com/docs/customize/actions) or /// [Rule](https://auth0.com/docs/customize/rules). + /// * [openUrl] Used to control the redirect and not rely on the SDK to do the + /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future loginWithRedirect( {final String? audience, final String? redirectUrl, @@ -108,6 +111,7 @@ class Auth0Web { final String? invitationUrl, final int? maxAge, final Set? scopes, + final void Function(String url)? openUrl, final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.loginWithRedirect(LoginOptions( audience: audience, @@ -115,6 +119,7 @@ class Auth0Web { organizationId: organizationId, invitationUrl: invitationUrl, scopes: scopes ?? {}, + openUrl: openUrl, idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), parameters: parameters)); diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index bb94f9740..2d5b858aa 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -61,8 +61,10 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); - final loginOptions = - interop.RedirectLoginOptions(authorizationParams: authParams); + final loginOptions = interop.RedirectLoginOptions( + authorizationParams: authParams, + openUrl: options?.openUrl, + ); return client.loginWithRedirect(loginOptions); } diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index 9367eef1d..a95502f8e 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -44,10 +44,14 @@ class AuthorizationParams { @anonymous class RedirectLoginOptions { external AuthorizationParams? get authorizationParams; + external void Function(String url)? openUrl; external String? get fragment; - external factory RedirectLoginOptions( - {final AuthorizationParams authorizationParams, final String fragment}); + external factory RedirectLoginOptions({ + final AuthorizationParams authorizationParams, + final String fragment, + final void Function(String url)? openUrl, + }); } @JS() diff --git a/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart b/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart index 3d7fb656e..dad07a522 100644 --- a/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart +++ b/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart @@ -1,4 +1,5 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + import '../auth0_flutter_platform_interface.dart'; class StubAuth0FlutterWeb extends Auth0FlutterWebPlatform {} diff --git a/auth0_flutter_platform_interface/lib/src/login_options.dart b/auth0_flutter_platform_interface/lib/src/login_options.dart index ad8a94217..ee44e5a6f 100644 --- a/auth0_flutter_platform_interface/lib/src/login_options.dart +++ b/auth0_flutter_platform_interface/lib/src/login_options.dart @@ -8,6 +8,7 @@ class LoginOptions implements RequestOptions { final String? redirectUrl; final String? organizationId; final String? invitationUrl; + final void Function(String url)? openUrl; final Map parameters; LoginOptions( @@ -17,6 +18,7 @@ class LoginOptions implements RequestOptions { this.redirectUrl, this.organizationId, this.invitationUrl, + this.openUrl, this.parameters = const {}}); @override @@ -29,6 +31,7 @@ class LoginOptions implements RequestOptions { 'redirectUrl': redirectUrl, 'organizationId': organizationId, 'invitationUrl': invitationUrl, + 'openUrl': openUrl, 'parameters': parameters, }; } From 4901c531c08dfa91a836e42de81213397595d0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 00:17:08 +0100 Subject: [PATCH 02/15] feat: allow async openUrl --- auth0_flutter/lib/auth0_flutter_web.dart | 2 +- auth0_flutter/lib/src/web/js_interop.dart | 4 ++-- auth0_flutter_platform_interface/lib/src/login_options.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 1ed0f926f..46b1c7e91 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -111,7 +111,7 @@ class Auth0Web { final String? invitationUrl, final int? maxAge, final Set? scopes, - final void Function(String url)? openUrl, + final Future Function(String url)? openUrl, final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.loginWithRedirect(LoginOptions( audience: audience, diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index a95502f8e..de4e0f7d0 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -44,13 +44,13 @@ class AuthorizationParams { @anonymous class RedirectLoginOptions { external AuthorizationParams? get authorizationParams; - external void Function(String url)? openUrl; + external Future Function(String url)? openUrl; external String? get fragment; external factory RedirectLoginOptions({ final AuthorizationParams authorizationParams, final String fragment, - final void Function(String url)? openUrl, + final Future Function(String url)? openUrl, }); } diff --git a/auth0_flutter_platform_interface/lib/src/login_options.dart b/auth0_flutter_platform_interface/lib/src/login_options.dart index ee44e5a6f..665b4408d 100644 --- a/auth0_flutter_platform_interface/lib/src/login_options.dart +++ b/auth0_flutter_platform_interface/lib/src/login_options.dart @@ -8,7 +8,7 @@ class LoginOptions implements RequestOptions { final String? redirectUrl; final String? organizationId; final String? invitationUrl; - final void Function(String url)? openUrl; + final Future Function(String url)? openUrl; final Map parameters; LoginOptions( From ac6f01b4e1e8df883fbbf9bc76131dd659fbd426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 01:07:01 +0100 Subject: [PATCH 03/15] feat: add openUrl to web logout --- auth0_flutter/lib/auth0_flutter_web.dart | 13 ++++++++++--- .../lib/src/web/auth0_flutter_plugin_real.dart | 4 ++-- .../web/extensions/logout_options.extension.dart | 9 ++++++--- auth0_flutter/lib/src/web/js_interop.dart | 8 ++++++-- .../lib/src/web/logout_options.dart | 3 ++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 46b1c7e91..bc78777ce 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -195,9 +195,16 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). - Future logout({final bool? federated, final String? returnToUrl}) => - Auth0FlutterWebPlatform.instance - .logout(LogoutOptions(federated: federated, returnTo: returnToUrl)); + Future logout({ + final bool? federated, + final String? returnToUrl, + final Future Function(String url)? openUrl, + }) => + Auth0FlutterWebPlatform.instance.logout(LogoutOptions( + federated: federated, + returnTo: returnToUrl, + openUrl: openUrl, + )); /// Retrieves a set of credentials for the user. /// diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 2d5b858aa..00f158a2d 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -61,10 +61,10 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); - final loginOptions = interop.RedirectLoginOptions( + final loginOptions = JsInteropUtils.stripNulls(interop.RedirectLoginOptions( authorizationParams: authParams, openUrl: options?.openUrl, - ); + )); return client.loginWithRedirect(loginOptions); } diff --git a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart index c87132d28..ac4ee2240 100644 --- a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart +++ b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart @@ -4,7 +4,10 @@ import '../js_interop.dart' as interop; import '../js_interop_utils.dart'; extension LogoutOptionsExtension on LogoutOptions { - interop.LogoutOptions toClientLogoutOptions() => interop.LogoutOptions( - logoutParams: JsInteropUtils.stripNulls( - interop.LogoutParams(federated: federated, returnTo: returnTo))); + interop.LogoutOptions toClientLogoutOptions() => + JsInteropUtils.stripNulls(interop.LogoutOptions( + openUrl: openUrl, + logoutParams: JsInteropUtils.stripNulls( + interop.LogoutParams(federated: federated, returnTo: returnTo)), + )); } diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index de4e0f7d0..e4e7429c6 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -154,8 +154,12 @@ class LogoutParams { @anonymous class LogoutOptions { external LogoutParams? get logoutParams; + external Future Function(String url)? openUrl; - external factory LogoutOptions({final LogoutParams? logoutParams}); + external factory LogoutOptions({ + final LogoutParams? logoutParams, + final Future Function(String url)? openUrl, + }); } @JS() @@ -188,5 +192,5 @@ class Auth0Client { external Future getTokenSilently( [final GetTokenSilentlyOptions? options]); external Future isAuthenticated(); - external Future logout([final LogoutOptions? logoutParams]); + external Future logout([final LogoutOptions? logoutOptions]); } diff --git a/auth0_flutter_platform_interface/lib/src/web/logout_options.dart b/auth0_flutter_platform_interface/lib/src/web/logout_options.dart index a41c0a9a7..caf6e5928 100644 --- a/auth0_flutter_platform_interface/lib/src/web/logout_options.dart +++ b/auth0_flutter_platform_interface/lib/src/web/logout_options.dart @@ -1,6 +1,7 @@ class LogoutOptions { final String? returnTo; final bool? federated; + final Future Function(String url)? openUrl; - LogoutOptions({this.returnTo, this.federated}); + LogoutOptions({this.returnTo, this.federated, this.openUrl}); } From 82b0dcae6a62606eaa609925977414bfddf5e672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 01:46:17 +0100 Subject: [PATCH 04/15] feat: use allowInterop on the input function to prevent client errors allowInterop can be used multiple times on the same function without adverse effects, so it is ok if the user also passes a function that has already been "interoped" --- auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 00f158a2d..66bbfa276 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -3,6 +3,7 @@ import 'dart:html'; import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:js/js.dart'; import 'auth0_flutter_web_platform_proxy.dart'; import 'extensions/client_options_extensions.dart'; @@ -61,9 +62,11 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); + final openUrl = options?.openUrl; + final loginOptions = JsInteropUtils.stripNulls(interop.RedirectLoginOptions( authorizationParams: authParams, - openUrl: options?.openUrl, + openUrl: openUrl != null ? allowInterop(openUrl) : null, )); return client.loginWithRedirect(loginOptions); From 391a9d2eef17caac5fd54d94b1f8b28d225ad6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:12:52 +0100 Subject: [PATCH 05/15] feat: add allowInterop to logout openUrl --- .../lib/src/web/extensions/logout_options.extension.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart index ac4ee2240..02d21dfc8 100644 --- a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart +++ b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart @@ -1,3 +1,5 @@ +import 'dart:js'; + import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; import '../js_interop.dart' as interop; @@ -6,7 +8,7 @@ import '../js_interop_utils.dart'; extension LogoutOptionsExtension on LogoutOptions { interop.LogoutOptions toClientLogoutOptions() => JsInteropUtils.stripNulls(interop.LogoutOptions( - openUrl: openUrl, + openUrl: openUrl != null ? allowInterop(openUrl!) : null, logoutParams: JsInteropUtils.stripNulls( interop.LogoutParams(federated: federated, returnTo: returnTo)), )); From 38d94decb4d4c9f5288d2acf876c6c9d6bc71881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:12:58 +0100 Subject: [PATCH 06/15] test: added unit test to verify openUrl is passed to correctly --- .../test/web/auth0_flutter_web_test.dart | 42 ++++++++++++++++++- .../web/auth0_flutter_web_test.mocks.dart | 32 +++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.dart b/auth0_flutter/test/web/auth0_flutter_web_test.dart index e224276e9..c322f6e63 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.dart @@ -12,9 +12,14 @@ import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; + import 'auth0_flutter_web_test.mocks.dart'; -@GenerateMocks([Auth0FlutterWebClientProxy]) +abstract class OpenUrl { + Future call(final String url) async {} +} + +@GenerateMocks([Auth0FlutterWebClientProxy, OpenUrl]) void main() { final auth0 = Auth0Web('test-domain', 'test-client-id'); final mockClientProxy = MockAuth0FlutterWebClientProxy(); @@ -140,6 +145,25 @@ void main() { expect(params.screen_hint, 'signup'); }); + test('loginWithRedirect supports openUrl', () async { + when(mockClientProxy.isAuthenticated()) + .thenAnswer((final _) => Future.value(false)); + + final openUrlMock = MockOpenUrl(); + await auth0.loginWithRedirect(openUrl: openUrlMock); + + final openUrl = verify(mockClientProxy.loginWithRedirect(captureAny)) + .captured + .first + .openUrl; + + expect(openUrl, isNotNull); + + await openUrl('http://open.url'); + + verify(openUrlMock('http://open.url')).called(1); + }); + test('loginWithRedirect strips options that are null', () async { when(mockClientProxy.isAuthenticated()) .thenAnswer((final _) => Future.value(false)); @@ -236,6 +260,22 @@ void main() { expect(params.returnTo, 'http://returnto.url'); }); + test('logout support openUrl', () async { + when(mockClientProxy.logout(any)).thenAnswer((final _) => Future.value()); + final openUrlMock = MockOpenUrl(); + + await auth0.logout(openUrl: openUrlMock); + + final openUrl = + verify(mockClientProxy.logout(captureAny)).captured.first.openUrl; + + expect(openUrl, isNotNull); + + await openUrl('http://open.url'); + + verify(openUrlMock('http://open.url')).called(1); + }); + test('loginWithPopup is called and succeeds', () async { when(mockClientProxy.loginWithPopup(any, any)) .thenAnswer((final _) => Future.value()); diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart index e5aadd54d..2affab285 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in auth0_flutter/test/web/auth0_flutter_web_test.dart. // Do not manually edit this file. @@ -10,10 +10,14 @@ import 'package:auth0_flutter/src/web/auth0_flutter_web_platform_proxy.dart' import 'package:auth0_flutter/src/web/js_interop.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; +import 'auth0_flutter_web_test.dart' as _i5; + // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -59,6 +63,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock Invocation.getter(#client), ), ) as _i2.Auth0Client); + @override _i4.Future loginWithRedirect(_i2.RedirectLoginOptions? options) => (super.noSuchMethod( @@ -69,6 +74,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future loginWithPopup([ _i2.PopupLoginOptions? options, @@ -85,6 +91,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future checkSession() => (super.noSuchMethod( Invocation.method( @@ -94,6 +101,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future<_i2.WebCredentials> getTokenSilently( [_i2.GetTokenSilentlyOptions? options]) => @@ -110,6 +118,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock ), )), ) as _i4.Future<_i2.WebCredentials>); + @override _i4.Future handleRedirectCallback() => (super.noSuchMethod( Invocation.method( @@ -119,6 +128,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future isAuthenticated() => (super.noSuchMethod( Invocation.method( @@ -127,6 +137,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock ), returnValue: _i4.Future.value(false), ) as _i4.Future); + @override _i4.Future logout(_i2.LogoutOptions? options) => (super.noSuchMethod( Invocation.method( @@ -137,3 +148,22 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); } + +/// A class which mocks [OpenUrl]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockOpenUrl extends _i1.Mock implements _i5.OpenUrl { + MockOpenUrl() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future call(String? url) => (super.noSuchMethod( + Invocation.method( + #call, + [url], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); +} From 9c21fc968cf7f86c279a37d50aa6a566eae56be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:17:02 +0100 Subject: [PATCH 07/15] doc: add missing logout openurl doc --- auth0_flutter/lib/auth0_flutter_web.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index bc78777ce..10a4e15b7 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -195,6 +195,7 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). + /// * You can use [openUrl] to control the redirect and not rely on the SDK. Future logout({ final bool? federated, final String? returnToUrl, From 2abd3d96b908e0c7c2c1c11f773f20c15d57a376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:19:36 +0100 Subject: [PATCH 08/15] doc: mention version on openurl doc --- auth0_flutter/lib/auth0_flutter_web.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 10a4e15b7..c0e9d435e 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -102,7 +102,7 @@ class Auth0Web { /// * Arbitrary [parameters] can be specified and then picked up in a custom /// Auth0 [Action](https://auth0.com/docs/customize/actions) or /// [Rule](https://auth0.com/docs/customize/rules). - /// * [openUrl] Used to control the redirect and not rely on the SDK to do the + /// * Use [openUrl] to control the redirect and not rely on the SDK to do the /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future loginWithRedirect( {final String? audience, @@ -195,7 +195,8 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). - /// * You can use [openUrl] to control the redirect and not rely on the SDK. + /// * Use [openUrl] to control the redirect and not rely on the SDK to do the + /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future logout({ final bool? federated, final String? returnToUrl, From ca8d581a7fd871934e6a10f8cce6d22290fb7315 Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 09:52:07 -0700 Subject: [PATCH 09/15] Add page_width: 80 to match line length settings --- auth0_flutter/analysis_options.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/auth0_flutter/analysis_options.yaml b/auth0_flutter/analysis_options.yaml index 5d3fe8b00..56766a4d1 100644 --- a/auth0_flutter/analysis_options.yaml +++ b/auth0_flutter/analysis_options.yaml @@ -19,6 +19,9 @@ analyzer: included_file_warning: warning todo: warning +formatter: + page_width: 80 + linter: rules: # Common rules (enabled) From 52be1b51fff802c898692aa2bd003b98c1e260c3 Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 09:52:20 -0700 Subject: [PATCH 10/15] Fix merge mistakes in lib/src/web/auth0_flutter_plugin_real.dart --- .../src/web/auth0_flutter_plugin_real.dart | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 34a3dde16..63b791f58 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -3,7 +3,6 @@ import 'dart:js_interop'; import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -import 'package:js/js.dart'; import 'package:web/web.dart'; import 'auth0_flutter_web_platform_proxy.dart'; @@ -40,19 +39,23 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { Future get appState => Future.value(_appState); @override - Future initialize(final ClientOptions clientOptions, final UserAgent userAgent) async { + Future initialize( + final ClientOptions clientOptions, final UserAgent userAgent) async { clientProxy ??= Auth0FlutterWebClientProxy( client: interop.Auth0Client( - JsInteropUtils.stripNulls(clientOptions.toAuth0ClientOptions(userAgent)), + JsInteropUtils.stripNulls( + clientOptions.toAuth0ClientOptions(userAgent)), ), ); final search = urlSearchProvider(); if (search?.contains('state=') == true && - (search?.contains('code=') == true || search?.contains('error=') == true)) { + (search?.contains('code=') == true || + search?.contains('error=') == true)) { try { - final interop.RedirectLoginResult result = await clientProxy!.handleRedirectCallback(); + final interop.RedirectLoginResult result = + await clientProxy!.handleRedirectCallback(); _appState = result.appState.dartify(); @@ -79,13 +82,20 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { organization: options?.organizationId, invitation: invitationTicket, max_age: options?.idTokenValidationConfig?.maxAge, - scope: options?.scopes.isNotEmpty == true ? options?.scopes.join(' ') : null, + scope: options?.scopes.isNotEmpty == true + ? options?.scopes.join(' ') + : null, ), options?.parameters ?? {}, ), ); - final loginOptions = interop.RedirectLoginOptions(authorizationParams: authParams); + final openUrl = options?.openUrl; + + final loginOptions = interop.RedirectLoginOptions( + authorizationParams: authParams, + openUrl: openUrl, + ); return client.loginWithRedirect(loginOptions); } @@ -102,7 +112,9 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { organization: options?.organizationId, invitation: invitationTicket, max_age: options?.idTokenValidationConfig?.maxAge, - scope: options?.scopes.isNotEmpty == true ? options?.scopes.join(' ') : null, + scope: options?.scopes.isNotEmpty == true + ? options?.scopes.join(' ') + : null, ), options?.parameters ?? {}, ), @@ -150,7 +162,8 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { @override Future credentials(final CredentialsOptions? options) async { final clientProxy = _ensureClient(); - final tokenOptions = options?.toGetTokenSilentlyOptions() ?? interop.GetTokenSilentlyOptions(); + final tokenOptions = options?.toGetTokenSilentlyOptions() ?? + interop.GetTokenSilentlyOptions(); // Force this, as we always want the full detail back so that we can // return a full Credentials instance. tokenOptions.detailedResponse = true; From 815c46b4ebda0cc2b806a3e9bd86473d0e2981d0 Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 10:08:39 -0700 Subject: [PATCH 11/15] Undo page format change since 80 doesn't seem to be used everywhere (e.g. tests). --- auth0_flutter/analysis_options.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/auth0_flutter/analysis_options.yaml b/auth0_flutter/analysis_options.yaml index 56766a4d1..5d3fe8b00 100644 --- a/auth0_flutter/analysis_options.yaml +++ b/auth0_flutter/analysis_options.yaml @@ -19,9 +19,6 @@ analyzer: included_file_warning: warning todo: warning -formatter: - page_width: 80 - linter: rules: # Common rules (enabled) From a562660ac3f44a60fb2d9b654be0c36f517c56f7 Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 10:16:22 -0700 Subject: [PATCH 12/15] Undo unnecessary formatting changes. --- auth0_flutter/lib/auth0_flutter_web.dart | 169 ++++++++-------- .../src/web/auth0_flutter_plugin_real.dart | 45 ++--- .../web/auth0_flutter_web_test.mocks.dart | 186 ++++++++++-------- .../lib/src/login_options.dart | 22 +-- 4 files changed, 222 insertions(+), 200 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 0b6024942..cf47c627c 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -11,7 +11,8 @@ class Auth0Web { final String? _redirectUrl; final CacheLocation? _cacheLocation; - final UserAgent _userAgent = UserAgent(name: 'auth0-flutter', version: version); + final UserAgent _userAgent = + UserAgent(name: 'auth0-flutter', version: version); /// Creates an instance of the [Auth0Web] client with the provided /// [domain], [clientId], and optional [redirectUrl] and [cacheLocation] properties. @@ -23,14 +24,11 @@ class Auth0Web { /// /// [domain] and [clientId] are both values that can be retrieved from the /// **Settings** page of your [Auth0 application](https://manage.auth0.com/#/applications/). - Auth0Web( - final String domain, - final String clientId, { - final String? redirectUrl, - final CacheLocation? cacheLocation, - }) : _account = Account(domain, clientId), - _redirectUrl = redirectUrl, - _cacheLocation = cacheLocation; + Auth0Web(final String domain, final String clientId, + {final String? redirectUrl, final CacheLocation? cacheLocation}) + : _account = Account(domain, clientId), + _redirectUrl = redirectUrl, + _cacheLocation = cacheLocation; /// Get the app state that was provided during a previous call /// to [loginWithRedirect]. @@ -56,43 +54,45 @@ class Auth0Web { /// to learn more. /// * [scopes] defaults to `openid profile email`. You can override these /// scopes, but `openid` is always requested regardless of this setting. - Future onLoad({ - final int? authorizeTimeoutInSeconds, - final CacheLocation? cacheLocation, - final String? cookieDomain, - final int? httpTimeoutInSeconds, - final String? issuer, - final int? leeway, - final bool? useLegacySameSiteCookie, - final int? sessionCheckExpiryInDays, - final bool? useCookiesForTransactions, - final bool? useFormData, - final bool? useRefreshTokens, - final bool? useRefreshTokensFallback, - final String? audience, - final Set? scopes, - final Map parameters = const {}, - }) async { + Future onLoad( + {final int? authorizeTimeoutInSeconds, + final CacheLocation? cacheLocation, + final String? cookieDomain, + final int? httpTimeoutInSeconds, + final String? issuer, + final int? leeway, + final bool? useLegacySameSiteCookie, + final int? sessionCheckExpiryInDays, + final bool? useCookiesForTransactions, + final bool? useFormData, + final bool? useRefreshTokens, + final bool? useRefreshTokensFallback, + final String? audience, + final Set? scopes, + final Map parameters = const {}}) async { await Auth0FlutterWebPlatform.instance.initialize( - ClientOptions( - account: _account, - authorizeTimeoutInSeconds: authorizeTimeoutInSeconds, - cacheLocation: cacheLocation ?? _cacheLocation, - cookieDomain: cookieDomain, - httpTimeoutInSeconds: httpTimeoutInSeconds, - idTokenValidationConfig: IdTokenValidationConfig(issuer: issuer, leeway: leeway), - useLegacySameSiteCookie: useLegacySameSiteCookie, - sessionCheckExpiryInDays: sessionCheckExpiryInDays, - useCookiesForTransactions: useCookiesForTransactions, - useFormData: useFormData, - useRefreshTokens: useRefreshTokens, - useRefreshTokensFallback: useRefreshTokensFallback, - audience: audience, - scopes: scopes, - parameters: {if (_redirectUrl != null) 'redirect_uri': _redirectUrl!, ...parameters}, - ), - _userAgent, - ); + ClientOptions( + account: _account, + authorizeTimeoutInSeconds: authorizeTimeoutInSeconds, + cacheLocation: cacheLocation ?? _cacheLocation, + cookieDomain: cookieDomain, + httpTimeoutInSeconds: httpTimeoutInSeconds, + idTokenValidationConfig: + IdTokenValidationConfig(issuer: issuer, leeway: leeway), + useLegacySameSiteCookie: useLegacySameSiteCookie, + sessionCheckExpiryInDays: sessionCheckExpiryInDays, + useCookiesForTransactions: useCookiesForTransactions, + useFormData: useFormData, + useRefreshTokens: useRefreshTokens, + useRefreshTokensFallback: useRefreshTokensFallback, + audience: audience, + scopes: scopes, + parameters: { + if (_redirectUrl != null) 'redirect_uri': _redirectUrl!, + ...parameters + }, + ), + _userAgent); if (await hasValidCredentials()) { return credentials(); @@ -139,19 +139,20 @@ class Auth0Web { final Set? scopes, final Future Function(String url)? openUrl, final Map parameters = const {}, - }) => Auth0FlutterWebPlatform.instance.loginWithRedirect( - LoginOptions( - appState: appState, - audience: audience, - redirectUrl: redirectUrl, - organizationId: organizationId, - invitationUrl: invitationUrl, - scopes: scopes ?? {}, - openUrl: openUrl, - idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), - parameters: parameters, - ), - ); + }) => + Auth0FlutterWebPlatform.instance.loginWithRedirect( + LoginOptions( + appState: appState, + audience: audience, + redirectUrl: redirectUrl, + organizationId: organizationId, + invitationUrl: invitationUrl, + scopes: scopes ?? {}, + openUrl: openUrl, + idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), + parameters: parameters, + ), + ); /// Opens a popup with the `/authorize` URL using the parameters provided as /// parameters. @@ -203,18 +204,16 @@ class Auth0Web { final dynamic popupWindow, final int? timeoutInSeconds, final Map parameters = const {}, - }) => Auth0FlutterWebPlatform.instance.loginWithPopup( - PopupLoginOptions( - audience: audience, - organizationId: organizationId, - invitationUrl: invitationUrl, - scopes: scopes ?? {}, - idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), - popupWindow: popupWindow, - timeoutInSeconds: timeoutInSeconds, - parameters: parameters, - ), - ); + }) => + Auth0FlutterWebPlatform.instance.loginWithPopup(PopupLoginOptions( + audience: audience, + organizationId: organizationId, + invitationUrl: invitationUrl, + scopes: scopes ?? {}, + idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), + popupWindow: popupWindow, + timeoutInSeconds: timeoutInSeconds, + parameters: parameters)); /// Redirects the browser to the Auth0 logout endpoint to end the user's /// session. @@ -234,9 +233,14 @@ class Auth0Web { final bool? federated, final String? returnToUrl, final Future Function(String url)? openUrl, - }) => Auth0FlutterWebPlatform.instance.logout( - LogoutOptions(federated: federated, returnTo: returnToUrl, openUrl: openUrl), - ); + }) => + Auth0FlutterWebPlatform.instance.logout( + LogoutOptions( + federated: federated, + returnTo: returnToUrl, + openUrl: openUrl, + ), + ); /// Retrieves a set of credentials for the user. /// @@ -267,16 +271,15 @@ class Auth0Web { final Set? scopes, final CacheMode? cacheMode, final Map parameters = const {}, - }) => Auth0FlutterWebPlatform.instance.credentials( - CredentialsOptions( - audience: audience, - timeoutInSeconds: timeoutInSeconds, - scopes: scopes, - cacheMode: cacheMode, - parameters: parameters, - ), - ); + }) => + Auth0FlutterWebPlatform.instance.credentials(CredentialsOptions( + audience: audience, + timeoutInSeconds: timeoutInSeconds, + scopes: scopes, + cacheMode: cacheMode, + parameters: parameters)); /// Indicates whether a user is currently authenticated. - Future hasValidCredentials() => Auth0FlutterWebPlatform.instance.hasValidCredentials(); + Future hasValidCredentials() => + Auth0FlutterWebPlatform.instance.hasValidCredentials(); } diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 63b791f58..06b230145 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -42,11 +42,8 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { Future initialize( final ClientOptions clientOptions, final UserAgent userAgent) async { clientProxy ??= Auth0FlutterWebClientProxy( - client: interop.Auth0Client( - JsInteropUtils.stripNulls( - clientOptions.toAuth0ClientOptions(userAgent)), - ), - ); + client: interop.Auth0Client(JsInteropUtils.stripNulls( + clientOptions.toAuth0ClientOptions(userAgent)))); final search = urlSearchProvider(); @@ -74,8 +71,7 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { final client = _ensureClient(); final invitationTicket = _getInvitationTicket(options?.invitationUrl); - final authParams = JsInteropUtils.stripNulls( - JsInteropUtils.addCustomParams( + final authParams = JsInteropUtils.stripNulls(JsInteropUtils.addCustomParams( interop.AuthorizationParams( audience: options?.audience, redirect_uri: options?.redirectUrl, @@ -86,13 +82,12 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { ? options?.scopes.join(' ') : null, ), - options?.parameters ?? {}, - ), - ); + options?.parameters ?? {})); final openUrl = options?.openUrl; final loginOptions = interop.RedirectLoginOptions( + appState: options?.appState.jsify(), authorizationParams: authParams, openUrl: openUrl, ); @@ -120,32 +115,24 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { ), ); - final popupConfig = JsInteropUtils.stripNulls( - interop.PopupConfigOptions( + final popupConfig = JsInteropUtils.stripNulls(interop.PopupConfigOptions( popup: options?.popupWindow as JSAny?, - timeoutInSeconds: options?.timeoutInSeconds, - ), - ); + timeoutInSeconds: options?.timeoutInSeconds)); try { await client.loginWithPopup( - interop.PopupLoginOptions(authorizationParams: authParams), - popupConfig, - ); + interop.PopupLoginOptions(authorizationParams: authParams), + popupConfig); return CredentialsExtension.fromWeb( - await client.getTokenSilently( - interop.GetTokenSilentlyOptions( - authorizationParams: JsInteropUtils.stripNulls( - interop.GetTokenSilentlyAuthParams( - scope: authParams.scope, - audience: authParams.audience, + await client.getTokenSilently(interop.GetTokenSilentlyOptions( + authorizationParams: JsInteropUtils.stripNulls( + interop.GetTokenSilentlyAuthParams( + scope: authParams.scope, + audience: authParams.audience, + ), ), - ), - detailedResponse: true, - ), - ), - ); + detailedResponse: true))); } catch (e) { throw WebExceptionExtension.fromJsObject(JSObject.fromInteropObject(e)); } diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart index ed6f24270..83a5f6074 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart @@ -6,7 +6,8 @@ import 'dart:async' as _i4; import 'dart:js_interop'; -import 'package:auth0_flutter/src/web/auth0_flutter_web_platform_proxy.dart' as _i3; +import 'package:auth0_flutter/src/web/auth0_flutter_web_platform_proxy.dart' + as _i3; import 'package:auth0_flutter/src/web/js_interop.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; import 'auth0_extension_type_mocks.dart'; @@ -28,49 +29,66 @@ import 'auth0_flutter_web_test.dart' as _i5; @JSExport() class _FakeAuth0Client_0 extends _i1.SmartFake implements Auth0ClientImpl { - _FakeAuth0Client_0(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); + _FakeAuth0Client_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); } @JSExport() -class _FakeWebCredentials_1 extends _i1.SmartFake implements WebCredentialsImpl { - _FakeWebCredentials_1(Object parent, Invocation parentInvocation) - : super(parent, parentInvocation); +class _FakeWebCredentials_1 extends _i1.SmartFake + implements WebCredentialsImpl { + _FakeWebCredentials_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); } @JSExport() -class _FakeRedirectLoginResult_2 extends _i1.SmartFake implements RedirectLoginResultImpl { - _FakeRedirectLoginResult_2(Object parent, Invocation parentInvocation) - : super(parent, parentInvocation); +class _FakeRedirectLoginResult_2 extends _i1.SmartFake + implements RedirectLoginResultImpl { + _FakeRedirectLoginResult_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); } /// A class which mocks [Auth0FlutterWebClientProxy]. /// /// See the documentation for Mockito's code generation for more information. -class MockAuth0FlutterWebClientProxy extends _i1.Mock implements _i3.Auth0FlutterWebClientProxy { +class MockAuth0FlutterWebClientProxy extends _i1.Mock + implements _i3.Auth0FlutterWebClientProxy { MockAuth0FlutterWebClientProxy() { _i1.throwOnMissingStub(this); } @override - _i2.Auth0Client get client => - (super.noSuchMethod( - Invocation.getter(#client), - returnValue: - createJSInteropWrapper<_FakeAuth0Client_0>( - _FakeAuth0Client_0(this, Invocation.getter(#client)), - ) - as _i2.Auth0Client, - ) - as _i2.Auth0Client); + _i2.Auth0Client get client => (super.noSuchMethod( + Invocation.getter(#client), + returnValue: createJSInteropWrapper<_FakeAuth0Client_0>( + _FakeAuth0Client_0(this, Invocation.getter(#client)), + ) as _i2.Auth0Client, + ) as _i2.Auth0Client); @override _i4.Future loginWithRedirect(_i2.RedirectLoginOptions? options) => (super.noSuchMethod( - Invocation.method(#loginWithRedirect, [options]), - returnValue: _i4.Future.value(), - returnValueForMissingStub: _i4.Future.value(), - ) - as _i4.Future); + Invocation.method( + #loginWithRedirect, + [options], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); @override _i4.Future loginWithPopup([ @@ -78,66 +96,82 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock implements _i3.Auth0Flutte _i2.PopupConfigOptions? config, ]) => (super.noSuchMethod( - Invocation.method(#loginWithPopup, [options, config]), - returnValue: _i4.Future.value(), - returnValueForMissingStub: _i4.Future.value(), - ) - as _i4.Future); + Invocation.method( + #loginWithPopup, + [ + options, + config, + ], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); @override - _i4.Future checkSession() => - (super.noSuchMethod( - Invocation.method(#checkSession, []), - returnValue: _i4.Future.value(), - returnValueForMissingStub: _i4.Future.value(), - ) - as _i4.Future); + _i4.Future checkSession() => (super.noSuchMethod( + Invocation.method(#checkSession, []), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); @override - _i4.Future<_i2.WebCredentials> getTokenSilently([_i2.GetTokenSilentlyOptions? options]) => + _i4.Future<_i2.WebCredentials> getTokenSilently( + [_i2.GetTokenSilentlyOptions? options]) => (super.noSuchMethod( - Invocation.method(#getTokenSilently, [options]), - returnValue: _i4.Future<_i2.WebCredentials>.value( - createJSInteropWrapper<_FakeWebCredentials_1>( - _FakeWebCredentials_1(this, Invocation.method(#getTokenSilently, [options])), - ) - as _i2.WebCredentials, - ), - ) - as _i4.Future<_i2.WebCredentials>); + Invocation.method( + #getTokenSilently, + [options], + ), + returnValue: _i4.Future<_i2.WebCredentials>.value( + createJSInteropWrapper<_FakeWebCredentials_1>( + _FakeWebCredentials_1( + this, + Invocation.method( + #getTokenSilently, + [options], + )), + ) as _i2.WebCredentials, + ), + ) as _i4.Future<_i2.WebCredentials>); @override _i4.Future<_i2.RedirectLoginResult> handleRedirectCallback([String? url]) => (super.noSuchMethod( - Invocation.method(#handleRedirectCallback, [url]), - returnValue: _i4.Future<_i2.RedirectLoginResult>.value( - createJSInteropWrapper<_FakeRedirectLoginResult_2>( - _FakeRedirectLoginResult_2( - this, - Invocation.method(#handleRedirectCallback, [url]), - ), - ) - as _i2.RedirectLoginResult, + Invocation.method( + #handleRedirectCallback, + [url], + ), + returnValue: _i4.Future<_i2.RedirectLoginResult>.value( + createJSInteropWrapper<_FakeRedirectLoginResult_2>( + _FakeRedirectLoginResult_2( + this, + Invocation.method( + #handleRedirectCallback, + [url], + ), ), - ) - as _i4.Future<_i2.RedirectLoginResult>); + ) as _i2.RedirectLoginResult, + ), + ) as _i4.Future<_i2.RedirectLoginResult>); @override - _i4.Future isAuthenticated() => - (super.noSuchMethod( - Invocation.method(#isAuthenticated, []), - returnValue: _i4.Future.value(false), - ) - as _i4.Future); + _i4.Future isAuthenticated() => (super.noSuchMethod( + Invocation.method( + #isAuthenticated, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); @override - _i4.Future logout(_i2.LogoutOptions? options) => - (super.noSuchMethod( - Invocation.method(#logout, [options]), - returnValue: _i4.Future.value(), - returnValueForMissingStub: _i4.Future.value(), - ) - as _i4.Future); + _i4.Future logout(_i2.LogoutOptions? options) => (super.noSuchMethod( + Invocation.method( + #logout, + [options], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); } /// A class which mocks [OpenUrl]. @@ -149,11 +183,9 @@ class MockOpenUrl extends _i1.Mock implements _i5.OpenUrl { } @override - _i4.Future call(String? url) => - (super.noSuchMethod( - Invocation.method(#call, [url]), - returnValue: _i4.Future.value(), - returnValueForMissingStub: _i4.Future.value(), - ) - as _i4.Future); + _i4.Future call(String? url) => (super.noSuchMethod( + Invocation.method(#call, [url]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); } diff --git a/auth0_flutter_platform_interface/lib/src/login_options.dart b/auth0_flutter_platform_interface/lib/src/login_options.dart index 6fb286f44..c68befc9c 100644 --- a/auth0_flutter_platform_interface/lib/src/login_options.dart +++ b/auth0_flutter_platform_interface/lib/src/login_options.dart @@ -26,15 +26,15 @@ class LoginOptions implements RequestOptions { @override Map toMap() => { - 'leeway': idTokenValidationConfig?.leeway, - 'issuer': idTokenValidationConfig?.issuer, - 'maxAge': idTokenValidationConfig?.maxAge, - 'audience': audience, - 'scopes': scopes.toList(), - 'redirectUrl': redirectUrl, - 'organizationId': organizationId, - 'invitationUrl': invitationUrl, - 'openUrl': openUrl, - 'parameters': parameters, - }; + 'leeway': idTokenValidationConfig?.leeway, + 'issuer': idTokenValidationConfig?.issuer, + 'maxAge': idTokenValidationConfig?.maxAge, + 'audience': audience, + 'scopes': scopes.toList(), + 'redirectUrl': redirectUrl, + 'organizationId': organizationId, + 'invitationUrl': invitationUrl, + 'openUrl': openUrl, + 'parameters': parameters, + }; } From 79c0b890765d4598c779d6d85f1de4fcd03aa41d Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 10:27:21 -0700 Subject: [PATCH 13/15] Undo more unnecessary formatting changes. --- auth0_flutter/lib/auth0_flutter_web.dart | 71 +++++----- .../src/web/auth0_flutter_plugin_real.dart | 35 ++--- auth0_flutter/lib/src/web/js_interop.dart | 134 +++++++++++------- .../web/auth0_flutter_web_test.mocks.dart | 44 +++--- 4 files changed, 151 insertions(+), 133 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index cf47c627c..ee8e77e43 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -72,26 +72,25 @@ class Auth0Web { final Map parameters = const {}}) async { await Auth0FlutterWebPlatform.instance.initialize( ClientOptions( - account: _account, - authorizeTimeoutInSeconds: authorizeTimeoutInSeconds, - cacheLocation: cacheLocation ?? _cacheLocation, - cookieDomain: cookieDomain, - httpTimeoutInSeconds: httpTimeoutInSeconds, - idTokenValidationConfig: - IdTokenValidationConfig(issuer: issuer, leeway: leeway), - useLegacySameSiteCookie: useLegacySameSiteCookie, - sessionCheckExpiryInDays: sessionCheckExpiryInDays, - useCookiesForTransactions: useCookiesForTransactions, - useFormData: useFormData, - useRefreshTokens: useRefreshTokens, - useRefreshTokensFallback: useRefreshTokensFallback, - audience: audience, - scopes: scopes, - parameters: { - if (_redirectUrl != null) 'redirect_uri': _redirectUrl!, - ...parameters - }, - ), + account: _account, + authorizeTimeoutInSeconds: authorizeTimeoutInSeconds, + cacheLocation: cacheLocation ?? _cacheLocation, + cookieDomain: cookieDomain, + httpTimeoutInSeconds: httpTimeoutInSeconds, + idTokenValidationConfig: + IdTokenValidationConfig(issuer: issuer, leeway: leeway), + useLegacySameSiteCookie: useLegacySameSiteCookie, + sessionCheckExpiryInDays: sessionCheckExpiryInDays, + useCookiesForTransactions: useCookiesForTransactions, + useFormData: useFormData, + useRefreshTokens: useRefreshTokens, + useRefreshTokensFallback: useRefreshTokensFallback, + audience: audience, + scopes: scopes, + parameters: { + if (_redirectUrl != null) 'redirect_uri': _redirectUrl!, + ...parameters + }), _userAgent); if (await hasValidCredentials()) { @@ -195,16 +194,15 @@ class Auth0Web { /// **Note:** This requires that `dart:html` be imported into the plugin /// package, which may generate [the warning](https://dart-lang.github.io/linter/lints/avoid_web_libraries_in_flutter.html) /// 'avoid_web_libraries_in_flutter'. - Future loginWithPopup({ - final String? audience, - final String? organizationId, - final String? invitationUrl, - final int? maxAge, - final Set? scopes, - final dynamic popupWindow, - final int? timeoutInSeconds, - final Map parameters = const {}, - }) => + Future loginWithPopup( + {final String? audience, + final String? organizationId, + final String? invitationUrl, + final int? maxAge, + final Set? scopes, + final dynamic popupWindow, + final int? timeoutInSeconds, + final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.loginWithPopup(PopupLoginOptions( audience: audience, organizationId: organizationId, @@ -265,13 +263,12 @@ class Auth0Web { /// * Arbitrary [parameters] can be specified and then picked up in a custom /// Auth0 [Action](https://auth0.com/docs/customize/actions) or /// [Rule](https://auth0.com/docs/customize/rules). - Future credentials({ - final String? audience, - final num? timeoutInSeconds, - final Set? scopes, - final CacheMode? cacheMode, - final Map parameters = const {}, - }) => + Future credentials( + {final String? audience, + final num? timeoutInSeconds, + final Set? scopes, + final CacheMode? cacheMode, + final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.credentials(CredentialsOptions( audience: audience, timeoutInSeconds: timeoutInSeconds, diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 06b230145..56fdeb57b 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -73,15 +73,14 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { final authParams = JsInteropUtils.stripNulls(JsInteropUtils.addCustomParams( interop.AuthorizationParams( - audience: options?.audience, - redirect_uri: options?.redirectUrl, - organization: options?.organizationId, - invitation: invitationTicket, - max_age: options?.idTokenValidationConfig?.maxAge, - scope: options?.scopes.isNotEmpty == true - ? options?.scopes.join(' ') - : null, - ), + audience: options?.audience, + redirect_uri: options?.redirectUrl, + organization: options?.organizationId, + invitation: invitationTicket, + max_age: options?.idTokenValidationConfig?.maxAge, + scope: options?.scopes.isNotEmpty == true + ? options?.scopes.join(' ') + : null), options?.parameters ?? {})); final openUrl = options?.openUrl; @@ -100,8 +99,7 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { final client = _ensureClient(); final invitationTicket = _getInvitationTicket(options?.invitationUrl); - final authParams = JsInteropUtils.stripNulls( - JsInteropUtils.addCustomParams( + final authParams = JsInteropUtils.stripNulls(JsInteropUtils.addCustomParams( interop.AuthorizationParams( audience: options?.audience, organization: options?.organizationId, @@ -111,9 +109,7 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { ? options?.scopes.join(' ') : null, ), - options?.parameters ?? {}, - ), - ); + options?.parameters ?? {})); final popupConfig = JsInteropUtils.stripNulls(interop.PopupConfigOptions( popup: options?.popupWindow as JSAny?, @@ -124,14 +120,11 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { interop.PopupLoginOptions(authorizationParams: authParams), popupConfig); - return CredentialsExtension.fromWeb( - await client.getTokenSilently(interop.GetTokenSilentlyOptions( + return CredentialsExtension.fromWeb(await client.getTokenSilently( + interop.GetTokenSilentlyOptions( authorizationParams: JsInteropUtils.stripNulls( - interop.GetTokenSilentlyAuthParams( - scope: authParams.scope, - audience: authParams.audience, - ), - ), + interop.GetTokenSilentlyAuthParams( + scope: authParams.scope, audience: authParams.audience)), detailedResponse: true))); } catch (e) { throw WebExceptionExtension.fromJsObject(JSObject.fromInteropObject(e)); diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index 8bb6a0f71..83dac7516 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -23,22 +23,21 @@ extension type AuthorizationParams._(JSObject _) implements JSObject { external String? get organization; external String? get scope; - external factory AuthorizationParams({ - final String? audience, - final String? redirect_uri, - final String? acr_values, - final String? display, - final String? login_hint, - final String? prompt, - final String? screen_hint, - final String? id_token_hint, - final int? max_age, - final String? ui_locales, - final String? connection, - final String? invitation, - final String? organization, - final String? scope, - }); + external factory AuthorizationParams( + {final String? audience, + final String? redirect_uri, + final String? acr_values, + final String? display, + final String? login_hint, + final String? prompt, + final String? screen_hint, + final String? id_token_hint, + final int? max_age, + final String? ui_locales, + final String? connection, + final String? invitation, + final String? organization, + final String? scope}); } @JS() @@ -62,7 +61,9 @@ extension type RedirectLoginOptions._(JSObject _) implements JSObject { extension type RedirectLoginResult._(JSObject _) implements JSObject { external JSAny? get appState; - external factory RedirectLoginResult({final JSAny? appState}); + external factory RedirectLoginResult({ + final JSAny? appState, + }); } @JS() @@ -91,24 +92,23 @@ extension type Auth0ClientInfo._(JSObject _) implements JSObject { @JS() @anonymous extension type Auth0ClientOptions._(JSObject _) implements JSObject { - external factory Auth0ClientOptions({ - required final Auth0ClientInfo clientInfo, - required final String domain, - required final String clientId, - final int? authorizeTimeoutInSeconds, - final String? cacheLocation, - final String? cookieDomain, - final int? httpTimeoutInSeconds, - final String? issuer, - final int? leeway, - final bool? legacySameSiteCookie, - final int? sessionCheckExpiryDays, - final bool? useCookiesForTransactions, - final bool? useFormData, - final bool? useRefreshTokens, - final bool? useRefreshTokensFallback, - final AuthorizationParams? authorizationParams, - }); + external factory Auth0ClientOptions( + {required final Auth0ClientInfo clientInfo, + required final String domain, + required final String clientId, + final int? authorizeTimeoutInSeconds, + final String? cacheLocation, + final String? cookieDomain, + final int? httpTimeoutInSeconds, + final String? issuer, + final int? leeway, + final bool? legacySameSiteCookie, + final int? sessionCheckExpiryDays, + final bool? useCookiesForTransactions, + final bool? useFormData, + final bool? useRefreshTokens, + final bool? useRefreshTokensFallback, + final AuthorizationParams? authorizationParams}); } @JS() @@ -117,7 +117,10 @@ extension type GetTokenSilentlyAuthParams._(JSObject _) implements JSObject { external String? scope; external String? audience; - external factory GetTokenSilentlyAuthParams({final String? audience, final String? scope}); + external factory GetTokenSilentlyAuthParams({ + final String? audience, + final String? scope, + }); } @JS() @@ -128,12 +131,11 @@ extension type GetTokenSilentlyOptions._(JSObject _) implements JSObject { external JSNumber? get timeoutInSeconds; external bool detailedResponse; - external factory GetTokenSilentlyOptions({ - final GetTokenSilentlyAuthParams? authorizationParams, - final String? cacheMode, - final JSNumber? timeoutInSeconds, - final bool? detailedResponse, - }); + external factory GetTokenSilentlyOptions( + {final GetTokenSilentlyAuthParams? authorizationParams, + final String? cacheMode, + final JSNumber? timeoutInSeconds, + final bool? detailedResponse}); } @JS() @@ -145,13 +147,12 @@ extension type WebCredentials._(JSObject _) implements JSObject { external String? get refresh_token; external String? get scope; - external factory WebCredentials({ - final String access_token, - final String id_token, - final JSNumber expires_in, - final String? refresh_token, - final String? scope, - }); + external factory WebCredentials( + {final String access_token, + final String id_token, + final JSNumber expires_in, + final String? refresh_token, + final String? scope}); } @JS() @@ -160,7 +161,10 @@ extension type LogoutParams._(JSObject _) implements JSObject { external String? get returnTo; external bool? get federated; - external factory LogoutParams({final String? returnTo, final bool? federated}); + external factory LogoutParams({ + final String? returnTo, + final bool? federated, + }); } @JS() @@ -180,7 +184,9 @@ extension type LogoutOptions._(JSObject _) implements JSObject { extension type PopupLoginOptions._(JSObject _) implements JSObject { external AuthorizationParams? get authorizationParams; - external factory PopupLoginOptions({final AuthorizationParams authorizationParams}); + external factory PopupLoginOptions({ + final AuthorizationParams authorizationParams, + }); } @JS() @@ -189,20 +195,38 @@ extension type PopupConfigOptions._(JSObject _) implements JSObject { external JSAny? get popup; external int? get timeoutInSeconds; - external factory PopupConfigOptions({final JSAny? popup, final int? timeoutInSeconds}); + external factory PopupConfigOptions({ + final JSAny? popup, + final int? timeoutInSeconds, + }); } @JS() extension type Auth0Client._(JSObject _) implements JSObject { external Auth0Client(final Auth0ClientOptions options); - external Future loginWithRedirect([final RedirectLoginOptions options]); + external Future loginWithRedirect([ + final RedirectLoginOptions options, + ]); external Future loginWithPopup([ final PopupLoginOptions? options, final PopupConfigOptions? config, ]); - external Future handleRedirectCallback([final String? url]); + external Future handleRedirectCallback([ + final String? url, + ]); external Future checkSession(); - external Future getTokenSilently([final GetTokenSilentlyOptions? options]); + external Future getTokenSilently([ + final GetTokenSilentlyOptions? options, + ]); external Future isAuthenticated(); external Future logout([final LogoutOptions? logoutParams]); } + +// TODO: remove this extension when updating to Dart 3.6.0 +extension JSArrayExt on JSArray { + @JS('length') + external int get arrayLength; + + @JS('at') + external JSFunction get elementAt; +} diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart index 83a5f6074..3ae2eb113 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart @@ -75,7 +75,10 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock _i2.Auth0Client get client => (super.noSuchMethod( Invocation.getter(#client), returnValue: createJSInteropWrapper<_FakeAuth0Client_0>( - _FakeAuth0Client_0(this, Invocation.getter(#client)), + _FakeAuth0Client_0( + this, + Invocation.getter(#client), + ), ) as _i2.Auth0Client, ) as _i2.Auth0Client); @@ -109,7 +112,10 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock @override _i4.Future checkSession() => (super.noSuchMethod( - Invocation.method(#checkSession, []), + Invocation.method( + #checkSession, + [], + ), returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); @@ -123,15 +129,14 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock [options], ), returnValue: _i4.Future<_i2.WebCredentials>.value( - createJSInteropWrapper<_FakeWebCredentials_1>( - _FakeWebCredentials_1( - this, - Invocation.method( - #getTokenSilently, - [options], - )), - ) as _i2.WebCredentials, - ), + createJSInteropWrapper<_FakeWebCredentials_1>( + _FakeWebCredentials_1( + this, + Invocation.method( + #getTokenSilently, + [options], + )), + ) as _i2.WebCredentials), ) as _i4.Future<_i2.WebCredentials>); @override @@ -142,16 +147,15 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock [url], ), returnValue: _i4.Future<_i2.RedirectLoginResult>.value( - createJSInteropWrapper<_FakeRedirectLoginResult_2>( - _FakeRedirectLoginResult_2( - this, - Invocation.method( - #handleRedirectCallback, - [url], - ), + createJSInteropWrapper<_FakeRedirectLoginResult_2>( + _FakeRedirectLoginResult_2( + this, + Invocation.method( + #handleRedirectCallback, + [url], ), - ) as _i2.RedirectLoginResult, - ), + ), + ) as _i2.RedirectLoginResult), ) as _i4.Future<_i2.RedirectLoginResult>); @override From 45d719901545bdc7bef8e269cc93a1423a463ddb Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 10:30:47 -0700 Subject: [PATCH 14/15] Undo more unnecessary formatting changes. --- .../src/web/auth0_flutter_plugin_real.dart | 15 ++++--- auth0_flutter/lib/src/web/js_interop.dart | 14 +++---- .../web/auth0_flutter_web_test.mocks.dart | 39 +++++++++---------- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 56fdeb57b..dd43de2fb 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -101,14 +101,13 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { final authParams = JsInteropUtils.stripNulls(JsInteropUtils.addCustomParams( interop.AuthorizationParams( - audience: options?.audience, - organization: options?.organizationId, - invitation: invitationTicket, - max_age: options?.idTokenValidationConfig?.maxAge, - scope: options?.scopes.isNotEmpty == true - ? options?.scopes.join(' ') - : null, - ), + audience: options?.audience, + organization: options?.organizationId, + invitation: invitationTicket, + max_age: options?.idTokenValidationConfig?.maxAge, + scope: options?.scopes.isNotEmpty == true + ? options?.scopes.join(' ') + : null), options?.parameters ?? {})); final popupConfig = JsInteropUtils.stripNulls(interop.PopupConfigOptions( diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index 83dac7516..1a87802de 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -204,22 +204,22 @@ extension type PopupConfigOptions._(JSObject _) implements JSObject { @JS() extension type Auth0Client._(JSObject _) implements JSObject { external Auth0Client(final Auth0ClientOptions options); - external Future loginWithRedirect([ + external JSPromise loginWithRedirect([ final RedirectLoginOptions options, ]); - external Future loginWithPopup([ + external JSPromise loginWithPopup([ final PopupLoginOptions? options, final PopupConfigOptions? config, ]); - external Future handleRedirectCallback([ + external JSPromise handleRedirectCallback([ final String? url, ]); - external Future checkSession(); - external Future getTokenSilently([ + external JSPromise checkSession(); + external JSPromise getTokenSilently([ final GetTokenSilentlyOptions? options, ]); - external Future isAuthenticated(); - external Future logout([final LogoutOptions? logoutParams]); + external JSPromise isAuthenticated(); + external JSPromise logout([final LogoutOptions? logoutParams]); } // TODO: remove this extension when updating to Dart 3.6.0 diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart index 3ae2eb113..6c9390356 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart @@ -74,12 +74,11 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock @override _i2.Auth0Client get client => (super.noSuchMethod( Invocation.getter(#client), - returnValue: createJSInteropWrapper<_FakeAuth0Client_0>( - _FakeAuth0Client_0( - this, - Invocation.getter(#client), - ), - ) as _i2.Auth0Client, + returnValue: + createJSInteropWrapper<_FakeAuth0Client_0>(_FakeAuth0Client_0( + this, + Invocation.getter(#client), + )) as _i2.Auth0Client, ) as _i2.Auth0Client); @override @@ -129,14 +128,13 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock [options], ), returnValue: _i4.Future<_i2.WebCredentials>.value( - createJSInteropWrapper<_FakeWebCredentials_1>( - _FakeWebCredentials_1( - this, - Invocation.method( - #getTokenSilently, - [options], - )), - ) as _i2.WebCredentials), + createJSInteropWrapper<_FakeWebCredentials_1>(_FakeWebCredentials_1( + this, + Invocation.method( + #getTokenSilently, + [options], + ), + )) as _i2.WebCredentials), ) as _i4.Future<_i2.WebCredentials>); @override @@ -148,14 +146,13 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock ), returnValue: _i4.Future<_i2.RedirectLoginResult>.value( createJSInteropWrapper<_FakeRedirectLoginResult_2>( - _FakeRedirectLoginResult_2( - this, - Invocation.method( - #handleRedirectCallback, - [url], - ), + _FakeRedirectLoginResult_2( + this, + Invocation.method( + #handleRedirectCallback, + [url], ), - ) as _i2.RedirectLoginResult), + )) as _i2.RedirectLoginResult), ) as _i4.Future<_i2.RedirectLoginResult>); @override From 98c28564707bc1a9457b60cb388391fe6e63a012 Mon Sep 17 00:00:00 2001 From: Trevor Dunn Date: Mon, 24 Nov 2025 10:37:36 -0700 Subject: [PATCH 15/15] Undo more unnecessary formatting changes. --- auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart | 4 ++-- auth0_flutter/lib/src/web/js_interop.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index dd43de2fb..8236cebda 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -85,11 +85,11 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { final openUrl = options?.openUrl; - final loginOptions = interop.RedirectLoginOptions( + final loginOptions = JsInteropUtils.stripNulls(interop.RedirectLoginOptions( appState: options?.appState.jsify(), authorizationParams: authParams, openUrl: openUrl, - ); + )); return client.loginWithRedirect(loginOptions); } diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index 1a87802de..a9f227c0d 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -212,14 +212,14 @@ extension type Auth0Client._(JSObject _) implements JSObject { final PopupConfigOptions? config, ]); external JSPromise handleRedirectCallback([ - final String? url, + final JSString? url, ]); external JSPromise checkSession(); external JSPromise getTokenSilently([ final GetTokenSilentlyOptions? options, ]); external JSPromise isAuthenticated(); - external JSPromise logout([final LogoutOptions? logoutParams]); + external JSPromise logout([final LogoutOptions? logoutOptions]); } // TODO: remove this extension when updating to Dart 3.6.0