diff --git a/.github/integ-config/detox-integ-all.yml b/.github/integ-config/detox-integ-all.yml index b58aefdda5c..3debdf83482 100644 --- a/.github/integ-config/detox-integ-all.yml +++ b/.github/integ-config/detox-integ-all.yml @@ -16,3 +16,7 @@ - test_name: 'integ_rn_ios_api_v6_rn_72_detox_cli' working_directory: amplify-js-samples-staging/samples/react-native/api/v6/ApiGRAPHQL timeout_minutes: 120 +- test_name: 'integ_rn_ios_oidc_signout' + working_directory: amplify-js-samples-staging/samples/react-native/auth/HosteduiApp + timeout_minutes: 120 + host_signout_page: true diff --git a/.github/integ-config/integ-all.yml b/.github/integ-config/integ-all.yml index 00c0f3bf598..c7316c37c1f 100644 --- a/.github/integ-config/integ-all.yml +++ b/.github/integ-config/integ-all.yml @@ -514,6 +514,13 @@ tests: sample_name: [sign-in-with-oauth] spec: sign-in-with-oauth browser: [chrome] + - test_name: integ_vue_sign_out_of_oidc_provider + desc: 'Sign-out of OIDC provider' + framework: vue + category: auth + sample_name: [sign-in-with-oauth] + spec: sign-out-oidc-provider + browser: [chrome] # AUTH GEN2 - test_name: integ_react_javascript_authentication_gen2 diff --git a/.github/workflows/callable-e2e-test-detox.yml b/.github/workflows/callable-e2e-test-detox.yml index f663220385f..ffea13efb6a 100644 --- a/.github/workflows/callable-e2e-test-detox.yml +++ b/.github/workflows/callable-e2e-test-detox.yml @@ -13,6 +13,10 @@ on: timeout_minutes: required: true type: number + host_signout_page: + required: false + type: boolean + default: false jobs: e2e-test: @@ -70,6 +74,11 @@ jobs: JEST_JUNIT_OUTPUT_NAME: detox-test-results.xml working-directory: ${{ inputs.working_directory }} shell: bash + - name: Start the http-server and host the oidc signout page locally (background). + if: ${{ inputs.host_signout_page }} + run: yarn host:signout + working-directory: ${{ inputs.working_directory }} + shell: bash - name: Detox run run: | $GITHUB_WORKSPACE/amplify-js/scripts/retry-yarn-script.sh -s 'detox test -c ios.sim.debug -u' -n 3 diff --git a/.github/workflows/callable-e2e-tests.yml b/.github/workflows/callable-e2e-tests.yml index c27c51ce57f..4ae74a69c88 100644 --- a/.github/workflows/callable-e2e-tests.yml +++ b/.github/workflows/callable-e2e-tests.yml @@ -74,3 +74,4 @@ jobs: test_name: ${{ matrix.integ-config.test_name }} working_directory: ${{ matrix.integ-config.working_directory }} timeout_minutes: ${{ matrix.integ-config.timeout_minutes || 45 }} + host_signout_page: ${{ matrix.integ-config.host_signout_page || false }} diff --git a/package.json b/package.json index fbe7ec06f07..2dd5ff3ff32 100644 --- a/package.json +++ b/package.json @@ -137,5 +137,8 @@ "nx": "16.7.0", "xml2js": "0.5.0", "tar": "6.2.1" + }, + "overrides": { + "tar": "6.2.1" } } diff --git a/packages/auth/__tests__/providers/cognito/signOut.test.ts b/packages/auth/__tests__/providers/cognito/signOut.test.ts index e7003463f4e..4992b4a3a5c 100644 --- a/packages/auth/__tests__/providers/cognito/signOut.test.ts +++ b/packages/auth/__tests__/providers/cognito/signOut.test.ts @@ -221,6 +221,7 @@ describe('signOut', () => { cognitoConfigWithOauth, mockDefaultOAuthStoreInstance, mockTokenOrchestrator, + undefined, ); // In cases of OAuth, token removal and Hub dispatch should be performed by the OAuth handling since // these actions can be deferred or canceled out of altogether. diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.native.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.native.test.ts new file mode 100644 index 00000000000..248bc00814a --- /dev/null +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.native.test.ts @@ -0,0 +1,35 @@ +import { invalidAppSchemeException } from '../../../../../src/errors/constants'; +import { getRedirectUrl } from '../../../../../src/providers/cognito/utils/oauth/getRedirectUrl.native'; + +describe('getRedirectUrl (native)', () => { + const mockRedirectUrls = [ + 'myDevApp://', + 'myProdApp://', + 'https://intermidiateSite.com', + ]; + + it('should return the first non http/s url from the array when redirectUrl is not provided', () => { + expect(getRedirectUrl(mockRedirectUrls)).toStrictEqual(mockRedirectUrls[0]); + }); + + it('should return redirectUrl if it matches at least one of the redirect urls from config', () => { + const configRedirectUrl = mockRedirectUrls[2]; + + expect(getRedirectUrl(mockRedirectUrls, configRedirectUrl)).toStrictEqual( + configRedirectUrl, + ); + }); + + it('should throw an exception when there is no url with no http nor https as prefix irrespective of a redirectUrl is given or not', () => { + const mockRedirectUrlsWithNoAppScheme = ['https://intermidiateSite.com']; + expect(() => + getRedirectUrl( + mockRedirectUrlsWithNoAppScheme, + mockRedirectUrlsWithNoAppScheme[0], + ), + ).toThrow(invalidAppSchemeException); + expect(() => getRedirectUrl(mockRedirectUrlsWithNoAppScheme)).toThrow( + invalidAppSchemeException, + ); + }); +}); diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.test.ts new file mode 100644 index 00000000000..0f75d28c640 --- /dev/null +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.test.ts @@ -0,0 +1,66 @@ +import { getRedirectUrl } from '../../../../../src/providers/cognito/utils/oauth'; +import { + invalidOriginException, + invalidPreferredRedirectUrlException, + invalidRedirectException, +} from '../../../../../src/errors/constants'; + +describe('getRedirectUrl', () => { + const mockRedirectUrls = ['https://example.com/app']; + let windowSpy: jest.SpyInstance; + + beforeEach(() => { + windowSpy = jest.spyOn(window, 'window', 'get'); + }); + + afterEach(() => { + windowSpy.mockRestore(); + }); + + it('should return the redirect url that has the same origin and same pathName', () => { + windowSpy.mockReturnValue({ + location: { + origin: 'https://example.com/', + pathname: 'app', + }, + }); + expect(getRedirectUrl(mockRedirectUrls)).toStrictEqual(mockRedirectUrls[0]); + }); + + it('should throw an invalid origin exception if there is no url that is the same origin and pathname', () => { + windowSpy.mockReturnValue({ + location: { + origin: 'https://differentOrigin.com/', + pathname: 'differentApp', + }, + }); + expect(() => getRedirectUrl(mockRedirectUrls)).toThrow( + invalidOriginException, + ); + }); + + it('should throw an invalid redirect exception if there is no url that is the same origin/pathname and is also not http or https', () => { + const mockNonHttpRedirectUrls = ['test-non-http-string']; + windowSpy.mockReturnValue({ + location: { + origin: 'https://differentOrigin.com/', + pathname: 'differentApp', + }, + }); + expect(() => getRedirectUrl(mockNonHttpRedirectUrls)).toThrow( + invalidRedirectException, + ); + }); + + it('should return the redirectUrl if it is provided and matches one of the redirectUrls from config', () => { + expect(getRedirectUrl(mockRedirectUrls, mockRedirectUrls[0])).toStrictEqual( + mockRedirectUrls[0], + ); + }); + + it('should throw an exception if redirectUrl is given but does not match any of the redirectUrls from config', () => { + expect(() => + getRedirectUrl(mockRedirectUrls, 'https://unknownOrigin.com'), + ).toThrow(invalidPreferredRedirectUrlException); + }); +}); diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.native.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.native.test.ts index 3d56cca1b90..bd056ccdf23 100644 --- a/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.native.test.ts +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.native.test.ts @@ -1,6 +1,7 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { tokenOrchestrator } from '../../../../../src/providers/cognito/tokenProvider'; import { completeOAuthSignOut } from '../../../../../src/providers/cognito/utils/oauth/completeOAuthSignOut'; import { handleOAuthSignOut } from '../../../../../src/providers/cognito/utils/oauth/handleOAuthSignOut.native'; import { oAuthSignOutRedirect } from '../../../../../src/providers/cognito/utils/oauth/oAuthSignOutRedirect'; @@ -23,6 +24,9 @@ describe('handleOAuthSignOut (native)', () => { // assert mocks const mockCompleteOAuthSignOut = completeOAuthSignOut as jest.Mock; const mockOAuthSignOutRedirect = oAuthSignOutRedirect as jest.Mock; + const mockTokenOrchestrator = tokenOrchestrator as jest.Mocked< + typeof tokenOrchestrator + >; // create mocks const mockStore = { loadOAuthSignIn: jest.fn(), @@ -43,33 +47,51 @@ describe('handleOAuthSignOut (native)', () => { }); it('should complete OAuth sign out and redirect', async () => { mockOAuthSignOutRedirect.mockResolvedValue({ type: 'success' }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); }); it('should not complete OAuth sign out if redirect is canceled', async () => { mockOAuthSignOutRedirect.mockResolvedValue({ type: 'canceled' }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).not.toHaveBeenCalled(); }); it('should not complete OAuth sign out if redirect failed', async () => { mockOAuthSignOutRedirect.mockResolvedValue({ type: 'error' }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).not.toHaveBeenCalled(); }); @@ -81,9 +103,18 @@ describe('handleOAuthSignOut (native)', () => { preferPrivateSession: true, }); mockOAuthSignOutRedirect.mockResolvedValue({ type: 'error' }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); - expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith(cognitoConfig, true); + expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( + cognitoConfig, + true, + undefined, + ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); }); @@ -92,7 +123,12 @@ describe('handleOAuthSignOut (native)', () => { isOAuthSignIn: false, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockOAuthSignOutRedirect).not.toHaveBeenCalled(); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.test.ts index 1ce83d076ed..6109b2e68e7 100644 --- a/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.test.ts +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.test.ts @@ -45,10 +45,19 @@ describe('handleOAuthSignOut', () => { isOAuthSignIn: true, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); - expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith(cognitoConfig); + expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( + cognitoConfig, + false, + undefined, + ); }); it('should complete OAuth sign out and redirect when there oauth metadata in tokenOrchestrator', async () => { @@ -59,10 +68,19 @@ describe('handleOAuthSignOut', () => { isOAuthSignIn: false, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); - expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith(cognitoConfig); + expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( + cognitoConfig, + false, + undefined, + ); }); it('should complete OAuth sign out but not redirect', async () => { @@ -70,7 +88,12 @@ describe('handleOAuthSignOut', () => { isOAuthSignIn: false, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); + await handleOAuthSignOut( + cognitoConfig, + mockStore, + mockTokenOrchestrator, + undefined, + ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); expect(mockOAuthSignOutRedirect).not.toHaveBeenCalled(); diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/oAuthSignOutRedirect.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/oAuthSignOutRedirect.test.ts index a16bbb54eb1..97cde00e5a0 100644 --- a/packages/auth/__tests__/providers/cognito/utils/oauth/oAuthSignOutRedirect.test.ts +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/oAuthSignOutRedirect.test.ts @@ -47,6 +47,7 @@ describe('oAuthSignOutRedirect', () => { expect(mockGetRedirectUrl).toHaveBeenCalledWith( authConfig.loginWith.oauth.redirectSignOut, + undefined, ); expect(mockOpenAuthSession).toHaveBeenCalledWith( `https://${domain}/logout?client_id=${userPoolClientId}&logout_uri=${encodedSignOutRedirectUrl}`, diff --git a/packages/auth/src/errors/constants.ts b/packages/auth/src/errors/constants.ts index 18ae41d71a6..faf1ceba375 100644 --- a/packages/auth/src/errors/constants.ts +++ b/packages/auth/src/errors/constants.ts @@ -10,6 +10,10 @@ export const DEVICE_METADATA_NOT_FOUND_EXCEPTION = 'DeviceMetadataNotFoundException'; export const AUTO_SIGN_IN_EXCEPTION = 'AutoSignInException'; export const INVALID_REDIRECT_EXCEPTION = 'InvalidRedirectException'; +export const INVALID_APP_SCHEME_EXCEPTION = 'InvalidAppSchemeException'; +export const INVALID_PREFERRED_REDIRECT_EXCEPTION = + 'InvalidPreferredRedirectUrlException'; + export const invalidRedirectException = new AuthError({ name: INVALID_REDIRECT_EXCEPTION, message: @@ -17,6 +21,19 @@ export const invalidRedirectException = new AuthError({ recoverySuggestion: 'Please make sure the signIn/Out redirect in your oauth config is valid.', }); +export const invalidAppSchemeException = new AuthError({ + name: INVALID_APP_SCHEME_EXCEPTION, + message: 'A valid non-http app scheme was not found in the config.', + recoverySuggestion: + 'Please make sure a valid custom app scheme is present in the config.', +}); +export const invalidPreferredRedirectUrlException = new AuthError({ + name: INVALID_PREFERRED_REDIRECT_EXCEPTION, + message: + 'The given preferredRedirectUrl does not match any items in the redirectSignOutUrls array from the config.', + recoverySuggestion: + 'Please make sure a matching preferredRedirectUrl is provided.', +}); export const INVALID_ORIGIN_EXCEPTION = 'InvalidOriginException'; export const invalidOriginException = new AuthError({ name: INVALID_ORIGIN_EXCEPTION, diff --git a/packages/auth/src/providers/cognito/apis/signOut.ts b/packages/auth/src/providers/cognito/apis/signOut.ts index fc98d3957f4..e073129ca10 100644 --- a/packages/auth/src/providers/cognito/apis/signOut.ts +++ b/packages/auth/src/providers/cognito/apis/signOut.ts @@ -60,7 +60,6 @@ export async function signOut(input?: SignOutInput): Promise { } catch (err) { hasOAuthConfig = false; } - if (hasOAuthConfig) { const oAuthStore = new DefaultOAuthStore(defaultStorage); oAuthStore.setAuthConfig(cognitoConfig); @@ -69,12 +68,12 @@ export async function signOut(input?: SignOutInput): Promise { cognitoConfig, oAuthStore, tokenOrchestrator, + input?.oauth?.redirectUrl, )) ?? {}; if (type === 'error') { throw new AuthError({ name: OAUTH_SIGNOUT_EXCEPTION, - message: - 'An error occurred when attempting to log out from OAuth provider.', + message: `An error occurred when attempting to log out from OAuth provider.`, }); } } else { diff --git a/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.native.ts b/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.native.ts index 315074aa69d..9719b5071cd 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.native.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.native.ts @@ -1,17 +1,34 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { invalidRedirectException } from '../../../../errors/constants'; +import { + invalidAppSchemeException, + invalidPreferredRedirectUrlException, +} from '../../../../errors/constants'; -/** @internal */ -export function getRedirectUrl(redirects: string[]): string { - const redirectUrl = redirects?.find( +/** +* - Validate there is always an appScheme (required), if not throw invalidAppSchemeException. +* - If a preferredRedirectUrl is given, validate it's in the configured list, if not throw invalidPreferredRedirectUrlException. +* - If preferredRedirectUrl is not given, use the appScheme which is present in the configured list. +@internal */ +export function getRedirectUrl( + redirects: string[], + preferredRedirectUrl?: string, +): string { + // iOS always requires a non http/s url (appScheme) to be registered so we validate it's existence here. + const appSchemeRedirectUrl = redirects?.find( redirect => !redirect.startsWith('http://') && !redirect.startsWith('https://'), ); - if (!redirectUrl) { - throw invalidRedirectException; + if (!appSchemeRedirectUrl) { + throw invalidAppSchemeException; + } + if (preferredRedirectUrl) { + if (redirects?.includes(preferredRedirectUrl)) { + return preferredRedirectUrl; + } + throw invalidPreferredRedirectUrlException; } - return redirectUrl; + return appSchemeRedirectUrl; } diff --git a/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.ts b/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.ts index 63c343b0e00..6becf884230 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/getRedirectUrl.ts @@ -2,22 +2,38 @@ // SPDX-License-Identifier: Apache-2.0 import { invalidOriginException, + invalidPreferredRedirectUrlException, invalidRedirectException, } from '../../../../errors/constants'; /** @internal */ -export function getRedirectUrl(redirects: string[]): string { - const redirectUrlFromTheSameOrigin = - redirects?.find(isSameOriginAndPathName) ?? - redirects?.find(isTheSameDomain); - const redirectUrlFromDifferentOrigin = - redirects?.find(isHttps) ?? redirects?.find(isHttp); - if (redirectUrlFromTheSameOrigin) { - return redirectUrlFromTheSameOrigin; - } else if (redirectUrlFromDifferentOrigin) { - throw invalidOriginException; +export function getRedirectUrl( + redirects: string[], + preferredRedirectUrl?: string, +): string { + if (preferredRedirectUrl) { + const redirectUrl = redirects?.find( + redirect => redirect === preferredRedirectUrl, + ); + if (!redirectUrl) { + throw invalidPreferredRedirectUrlException; + } + + return redirectUrl; + } else { + const redirectUrlFromTheSameOrigin = + redirects?.find(isSameOriginAndPathName) ?? + redirects?.find(isTheSameDomain); + const redirectUrlFromDifferentOrigin = + redirects?.find(isHttps) ?? redirects?.find(isHttp); + + if (redirectUrlFromTheSameOrigin) { + return redirectUrlFromTheSameOrigin; + } else if (redirectUrlFromDifferentOrigin) { + throw invalidOriginException; + } + throw invalidRedirectException; } - throw invalidRedirectException; } // origin + pathname => https://example.com/app diff --git a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts index bd9c8416b55..e67c8a255ef 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts @@ -5,6 +5,7 @@ import { CognitoUserPoolConfig } from '@aws-amplify/core'; import { OpenAuthSessionResult } from '../../../../utils/types'; import { DefaultOAuthStore } from '../../utils/signInWithRedirectStore'; +import { TokenOrchestrator } from '../../tokenProvider'; import { completeOAuthSignOut } from './completeOAuthSignOut'; import { oAuthSignOutRedirect } from './oAuthSignOutRedirect'; @@ -12,13 +13,16 @@ import { oAuthSignOutRedirect } from './oAuthSignOutRedirect'; export const handleOAuthSignOut = async ( cognitoConfig: CognitoUserPoolConfig, store: DefaultOAuthStore, + // No-op here as it's only used in the non-native implementation + tokenOrchestrator: TokenOrchestrator, + redirectUrl: string | undefined, ): Promise => { const { isOAuthSignIn, preferPrivateSession } = await store.loadOAuthSignIn(); - if (isOAuthSignIn) { const result = await oAuthSignOutRedirect( cognitoConfig, preferPrivateSession, + redirectUrl, ); // If this was a private session, clear data and tokens regardless of what happened with logout // endpoint. Otherwise, only do so if the logout endpoint was succesfully visited. diff --git a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.ts b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.ts index ecb09f23bc5..da4f7eb380a 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.ts @@ -14,6 +14,7 @@ export const handleOAuthSignOut = async ( cognitoConfig: CognitoUserPoolConfig, store: DefaultOAuthStore, tokenOrchestrator: TokenOrchestrator, + redirectUrl: string | undefined, ): Promise => { const { isOAuthSignIn } = await store.loadOAuthSignIn(); const oauthMetadata = await tokenOrchestrator.getOAuthMetadata(); @@ -30,6 +31,6 @@ export const handleOAuthSignOut = async ( // storage mechanism that is used by Amplify. if (isOAuthSignIn || oauthMetadata?.oauthSignIn) { // On web, this will always end up being a void action - return oAuthSignOutRedirect(cognitoConfig); + return oAuthSignOutRedirect(cognitoConfig, false, redirectUrl); } }; diff --git a/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts b/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts index 2dd1eda520a..f86c0686df6 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts @@ -12,11 +12,12 @@ import { getRedirectUrl } from './getRedirectUrl'; export const oAuthSignOutRedirect = async ( authConfig: CognitoUserPoolConfig, preferPrivateSession = false, + redirectUrl?: string, ): Promise => { assertOAuthConfig(authConfig); const { loginWith, userPoolClientId } = authConfig; const { domain, redirectSignOut } = loginWith.oauth; - const signoutUri = getRedirectUrl(redirectSignOut); + const signoutUri = getRedirectUrl(redirectSignOut, redirectUrl); const oAuthLogoutEndpoint = `https://${domain}/logout?${Object.entries({ client_id: userPoolClientId, logout_uri: encodeURIComponent(signoutUri), diff --git a/packages/auth/src/types/inputs.ts b/packages/auth/src/types/inputs.ts index 437f5e398f4..6e152cdc1e5 100644 --- a/packages/auth/src/types/inputs.ts +++ b/packages/auth/src/types/inputs.ts @@ -47,6 +47,9 @@ export interface AuthSignInInput< } export interface AuthSignOutInput { global: boolean; + oauth?: { + redirectUrl?: string; + }; } export type AuthProvider = 'Amazon' | 'Apple' | 'Facebook' | 'Google'; diff --git a/packages/aws-amplify/package.json b/packages/aws-amplify/package.json index b79b7c15eaa..a5bbb244579 100644 --- a/packages/aws-amplify/package.json +++ b/packages/aws-amplify/package.json @@ -299,7 +299,7 @@ "name": "[Analytics] record (Kinesis)", "path": "./dist/esm/analytics/kinesis/index.mjs", "import": "{ record }", - "limit": "48.61 kB" + "limit": "48.74 kB" }, { "name": "[Analytics] record (Kinesis Firehose)", @@ -383,31 +383,31 @@ "name": "[Auth] confirmSignIn (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ confirmSignIn }", - "limit": "28.38 kB" + "limit": "28.39 kB" }, { "name": "[Auth] updateMFAPreference (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ updateMFAPreference }", - "limit": "11.87 kB" + "limit": "11.98 kB" }, { "name": "[Auth] fetchMFAPreference (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ fetchMFAPreference }", - "limit": "11.90 kB" + "limit": "12.1 kB" }, { "name": "[Auth] verifyTOTPSetup (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ verifyTOTPSetup }", - "limit": "12.75 kB" + "limit": "12.86 kB" }, { "name": "[Auth] updatePassword (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ updatePassword }", - "limit": "12.76 kB" + "limit": "12.87 kB" }, { "name": "[Auth] setUpTOTP (Cognito)", @@ -419,43 +419,43 @@ "name": "[Auth] updateUserAttributes (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ updateUserAttributes }", - "limit": "12.00 kB" + "limit": "12.1 kB" }, { "name": "[Auth] getCurrentUser (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ getCurrentUser }", - "limit": "7.85 kB" + "limit": "7.97 kB" }, { "name": "[Auth] confirmUserAttribute (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ confirmUserAttribute }", - "limit": "12.75 kB" + "limit": "12.86 kB" }, { "name": "[Auth] signInWithRedirect (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ signInWithRedirect }", - "limit": "21.15 kB" + "limit": "21.19 kB" }, { "name": "[Auth] fetchUserAttributes (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ fetchUserAttributes }", - "limit": "11.81 kB" + "limit": "11.93 kB" }, { "name": "[Auth] Basic Auth Flow (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ signIn, signOut, fetchAuthSession, confirmSignIn }", - "limit": "30.15 kB" + "limit": "30.23 kB" }, { "name": "[Auth] OAuth Auth Flow (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ signInWithRedirect, signOut, fetchAuthSession }", - "limit": "21.58 kB" + "limit": "21.66 kB" }, { "name": "[Storage] copy (S3)", diff --git a/packages/rtn-web-browser/package.json b/packages/rtn-web-browser/package.json index e1b0366cef3..edfc4bf0023 100644 --- a/packages/rtn-web-browser/package.json +++ b/packages/rtn-web-browser/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@types/react-native": "0.70.0", - "react-native": "0.72.3", + "react-native": "0.72.15", "typescript": "5.1.6" }, "repository": { diff --git a/yarn.lock b/yarn.lock index a55f7941b12..9da6aee53e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3331,12 +3331,12 @@ dependencies: merge-options "^3.0.4" -"@react-native-community/cli-clean@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.5.tgz#07c8a01e433ea6c6e32eb647908be48952888cdd" - integrity sha512-1+7BU962wKkIkHRp/uW3jYbQKKGtU7L+R3g59D8K6uLccuxJYUBJv18753ojMa6SD3SAq5Xh31bAre+YwVcOTA== +"@react-native-community/cli-clean@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.4.1.tgz#0155a02e4158c8a61ba3d7a2b08f3ebebed81906" + integrity sha512-cwUbY3c70oBGv3FvQJWe2Qkq6m1+/dcEBonMDTYyH6i+6OrkzI4RkIGpWmbG1IS5JfE9ISUZkNL3946sxyWNkw== dependencies: - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" execa "^5.0.0" prompts "^2.4.0" @@ -3361,12 +3361,12 @@ execa "^1.0.0" prompts "^2.4.0" -"@react-native-community/cli-config@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.5.tgz#07e48bb6cdecaa2aafa20da9888b5f35383a4382" - integrity sha512-fMblIsHlUleKfGsgWyjFJYfx1SqrsnhS/QXfA8w7iT6GrNOOjBp5UWx8+xlMDFcmOb9e42g1ExFDKl3n8FWkxQ== +"@react-native-community/cli-config@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.4.1.tgz#c27f91d2753f0f803cc79bbf299f19648a5d5627" + integrity sha512-sLdv1HFVqu5xNpeaR1+std0t7FFZaobpmpR0lFCOzKV7H/l611qS2Vo8zssmMK+oQbCs5JsX3SFPciODeIlaWA== dependencies: - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" cosmiconfig "^5.1.0" deepmerge "^4.3.0" @@ -3397,10 +3397,10 @@ glob "^7.1.3" joi "^17.2.1" -"@react-native-community/cli-debugger-ui@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.5.tgz#0dbb27759b9f6e4ca8cfcaab4fabfe349f765356" - integrity sha512-o5JVCKEpPUXMX4r3p1cYjiy3FgdOEkezZcQ6owWEae2dYvV19lLYyJwnocm9Y7aG9PvpgI3PIMVh3KZbhS21eA== +"@react-native-community/cli-debugger-ui@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.4.1.tgz#783cc276e1360baf8235dc8c6ebbbce0fe01d944" + integrity sha512-+pgIjGNW5TrJF37XG3djIOzP+WNoPp67to/ggDhrshuYgpymfb9XpDVsURJugy0Sy3RViqb83kQNK765QzTIvw== dependencies: serve-static "^1.13.1" @@ -3425,25 +3425,24 @@ dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.5.tgz#f11e0651c53e0b58487837a272af725f046a5842" - integrity sha512-+4BuFHjoV4FFjX5y60l0s6nS0agidb1izTVwsFixeFKW73LUkOLu+Ae5HI94RAFEPE4ePEVNgYX3FynIau6K0g== +"@react-native-community/cli-doctor@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.4.1.tgz#516ef5932de3e12989695e7cb7aba82b81e7b2de" + integrity sha512-O6oPiRsl8pdkcyNktpzvJAXUqdocoY4jh7Tt7wA69B1JKCJA7aPCecwJgpUZb63ZYoxOtRtYM3BYQKzRMLIuUw== dependencies: - "@react-native-community/cli-config" "11.3.5" - "@react-native-community/cli-platform-android" "11.3.5" - "@react-native-community/cli-platform-ios" "11.3.5" - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-config" "11.4.1" + "@react-native-community/cli-platform-android" "11.4.1" + "@react-native-community/cli-platform-ios" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" command-exists "^1.2.8" envinfo "^7.7.2" execa "^5.0.0" hermes-profile-transformer "^0.0.6" - ip "^1.1.5" node-stream-zip "^1.9.1" ora "^5.4.1" prompts "^2.4.0" - semver "^6.3.0" + semver "^7.5.2" strip-ansi "^5.2.0" sudo-prompt "^9.0.0" wcwidth "^1.0.1" @@ -3492,16 +3491,15 @@ sudo-prompt "^9.0.0" wcwidth "^1.0.1" -"@react-native-community/cli-hermes@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.5.tgz#fb557790a34f4354fa7a91b02217cdded26cafc4" - integrity sha512-+3m34hiaJpFel8BlJE7kJOaPzWR/8U8APZG2LXojbAdBAg99EGmQcwXIgsSVJFvH8h/nezf4DHbsPKigIe33zA== +"@react-native-community/cli-hermes@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.4.1.tgz#abf487ae8ab53c66f6f1178bcd37ecbbbac9fb5c" + integrity sha512-1VAjwcmv+i9BJTMMVn5Grw7AcgURhTyfHVghJ1YgBE2euEJxPuqPKSxP54wBOQKnWUwsuDQAtQf+jPJoCxJSSA== dependencies: - "@react-native-community/cli-platform-android" "11.3.5" - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-platform-android" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" hermes-profile-transformer "^0.0.6" - ip "^1.1.5" "@react-native-community/cli-hermes@^10.0.0": version "10.2.7" @@ -3524,12 +3522,12 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-android@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.5.tgz#8be7ef382a3182fe63a698ed2edd4d90ab19246a" - integrity sha512-s4Lj7FKxJ/BofGi/ifjPfrA9MjFwIgYpHnHBSlqtbsvPoSYzmVCU2qlWM8fb3AmkXIwyYt4A6MEr3MmNT2UoBg== +"@react-native-community/cli-platform-android@11.4.1", "@react-native-community/cli-platform-android@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.4.1.tgz#ec5fc97e87834f2e33cb0d34dcef6c17b20f60fc" + integrity sha512-VMmXWIzk0Dq5RAd+HIEa3Oe7xl2jso7+gOr6E2HALF4A3fCKUjKZQ6iK2t6AfnY04zftvaiKw6zUXtrfl52AVQ== dependencies: - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" execa "^5.0.0" glob "^7.1.3" @@ -3581,12 +3579,12 @@ glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-platform-ios@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.5.tgz#12a8cbf2638400b9986709466653ce4e7c9eca2a" - integrity sha512-ytJC/YCFD7P+KuQHOT5Jzh1ho2XbJEjq71yHa1gJP2PG/Q/uB4h1x2XpxDqv5iXU6E250yjvKMmkReKTW4CTig== +"@react-native-community/cli-platform-ios@11.4.1", "@react-native-community/cli-platform-ios@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.4.1.tgz#12d72741273b684734d5ed021415b7f543a6f009" + integrity sha512-RPhwn+q3IY9MpWc9w/Qmzv03mo8sXdah2eSZcECgweqD5SHWtOoRCUt11zM8jASpAQ8Tm5Je7YE9bHvdwGl4hA== dependencies: - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.0.12" @@ -3612,21 +3610,21 @@ glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-plugin-metro@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.5.tgz#5614c7ef3bc83cf70bcb0e6d988ab9d84a76008a" - integrity sha512-r9AekfeLKdblB7LfWB71IrNy1XM03WrByQlUQajUOZAP2NmUUBLl9pMZscPjJeOSgLpHB9ixEFTIOhTabri/qg== +"@react-native-community/cli-plugin-metro@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.4.1.tgz#8d51c59a9a720f99150d4153e757d5d1d1dabd22" + integrity sha512-JxbIqknYcQ5Z4rWROtu5LNakLfMiKoWcMoPqIrBLrV5ILm1XUJj1/8fATCcotZqV3yzB3SCJ3RrhKx7dQ3YELw== dependencies: - "@react-native-community/cli-server-api" "11.3.5" - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-server-api" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" chalk "^4.1.2" execa "^5.0.0" - metro "0.76.7" - metro-config "0.76.7" - metro-core "0.76.7" - metro-react-native-babel-transformer "0.76.7" - metro-resolver "0.76.7" - metro-runtime "0.76.7" + metro "^0.76.9" + metro-config "^0.76.9" + metro-core "^0.76.9" + metro-react-native-babel-transformer "^0.76.9" + metro-resolver "^0.76.9" + metro-runtime "^0.76.9" readline "^1.3.0" "@react-native-community/cli-plugin-metro@^10.0.0": @@ -3646,13 +3644,13 @@ metro-runtime "0.73.10" readline "^1.3.0" -"@react-native-community/cli-server-api@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.5.tgz#6f43f5844bd1eb73166546b8fa8bfd32064b21e7" - integrity sha512-PM/jF13uD1eAKuC84lntNuM5ZvJAtyb+H896P1dBIXa9boPLa3KejfUvNVoyOUJ5s8Ht25JKbc3yieV2+GMBDA== +"@react-native-community/cli-server-api@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.4.1.tgz#3dda094c4ab2369db34fe991c320e3cd78f097b3" + integrity sha512-isxXE8X5x+C4kN90yilD08jaLWD34hfqTfn/Xbl1u/igtdTsCaQGvWe9eaFamrpWFWTpVtj6k+vYfy8AtYSiKA== dependencies: - "@react-native-community/cli-debugger-ui" "11.3.5" - "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-debugger-ui" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.1" @@ -3706,10 +3704,10 @@ serve-static "^1.13.1" ws "^7.5.1" -"@react-native-community/cli-tools@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.5.tgz#3f9d23a4c961d963f85c254718636db8a5fa3bce" - integrity sha512-zDklE1+ah/zL4BLxut5XbzqCj9KTHzbYBKX7//cXw2/0TpkNCaY9c+iKx//gZ5m7U1OKbb86Fm2b0AKtKVRf6Q== +"@react-native-community/cli-tools@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.4.1.tgz#f6c69967e077b10cd8a884a83e53eb199dd9ee9f" + integrity sha512-GuQIuY/kCPfLeXB1aiPZ5HvF+e/wdO42AYuNEmT7FpH/0nAhdTxA9qjL8m3vatDD2/YK7WNOSVNsl2UBZuOISg== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" @@ -3718,7 +3716,7 @@ node-fetch "^2.6.0" open "^6.2.0" ora "^5.4.1" - semver "^6.3.0" + semver "^7.5.2" shell-quote "^1.7.3" "@react-native-community/cli-tools@14.0.0": @@ -3768,10 +3766,10 @@ semver "^6.3.0" shell-quote "^1.7.3" -"@react-native-community/cli-types@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.5.tgz#9051205e164d5585f1ae3869a3b3ca1f2f43b9ba" - integrity sha512-pf0kdWMEfPSV/+8rcViDCFzbLMtWIHMZ8ay7hKwqaoWegsJ0oprSF2tSTH+LSC/7X1Beb9ssIvHj1m5C4es5Xg== +"@react-native-community/cli-types@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.4.1.tgz#3842dc37ba3b09f929b485bcbd8218de19349ac2" + integrity sha512-B3q9A5BCneLDSoK/iSJ06MNyBn1qTxjdJeOgeS3MiCxgJpPcxyn/Yrc6+h0Cu9T9sgWj/dmectQPYWxtZeo5VA== dependencies: joi "^17.2.1" @@ -3857,6 +3855,29 @@ prompts "^2.4.2" semver "^7.5.2" +"@react-native-community/cli@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.4.1.tgz#9a6346486622860dad721da406df70e29a45491f" + integrity sha512-NdAageVMtNhtvRsrq4NgJf5Ey2nA1CqmLvn7PhSawg+aIzMKmZuzWxGVwr9CoPGyjvNiqJlCWrLGR7NzOyi/sA== + dependencies: + "@react-native-community/cli-clean" "11.4.1" + "@react-native-community/cli-config" "11.4.1" + "@react-native-community/cli-debugger-ui" "11.4.1" + "@react-native-community/cli-doctor" "11.4.1" + "@react-native-community/cli-hermes" "11.4.1" + "@react-native-community/cli-plugin-metro" "11.4.1" + "@react-native-community/cli-server-api" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" + "@react-native-community/cli-types" "11.4.1" + chalk "^4.1.2" + commander "^9.4.1" + execa "^5.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.0" + semver "^7.5.2" + "@react-native-community/netinfo@4.7.0": version "4.7.0" resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-4.7.0.tgz#7482d36836cac69d0a0ae25581f65bc472639930" @@ -3949,7 +3970,7 @@ nullthrows "^1.1.1" yargs "^17.6.2" -"@react-native/codegen@^0.72.6": +"@react-native/codegen@^0.72.8": version "0.72.8" resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== @@ -4053,7 +4074,7 @@ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.75.2.tgz#de095f4b985580748ffa239a70ae63fbaa93724e" integrity sha512-nPwWJFtsqNFS/qSG9yDOiSJ64mjG7RCP4X/HXFfyWzCM1jq49h/DYBdr+c3e7AvTKGIdy0gGT3vgaRUHZFVdUQ== -"@react-native/normalize-colors@^0.72.0": +"@react-native/normalize-colors@<0.73.0", "@react-native/normalize-colors@^0.72.0": version "0.72.0" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212" integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== @@ -4071,7 +4092,7 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-native/virtualized-lists@^0.72.6": +"@react-native/virtualized-lists@^0.72.8": version "0.72.8" resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz#a2c6a91ea0f1d40eb5a122fb063daedb92ed1dc3" integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== @@ -7338,15 +7359,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -deprecated-react-native-prop-types@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz#8ed03a64c21b7fbdd2d000957b6838d4f38d2c66" - integrity sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw== - dependencies: - "@react-native/normalize-colors" "*" - invariant "*" - prop-types "*" - deprecated-react-native-prop-types@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.2.tgz#e724a9837e6a7ccb778753c06ae4f79065873493" @@ -9260,7 +9272,7 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -invariant@*, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -10908,10 +10920,10 @@ metro-babel-transformer@0.73.5: metro-source-map "0.73.5" nullthrows "^1.1.1" -metro-babel-transformer@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.7.tgz#ba620d64cbaf97d1aa14146d654a3e5d7477fc62" - integrity sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw== +metro-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz#5efd1027353b36b73706164ef09c290dceac096a" + integrity sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA== dependencies: "@babel/core" "^7.20.0" hermes-parser "0.12.0" @@ -11097,10 +11109,10 @@ metro-file-map@0.73.10: optionalDependencies: fsevents "^2.3.2" -metro-file-map@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.7.tgz#0f041a4f186ac672f0188180310609c8483ffe89" - integrity sha512-s+zEkTcJ4mOJTgEE2ht4jIo1DZfeWreQR3tpT3gDV/Y/0UQ8aJBTv62dE775z0GLsWZApiblAYZsj7ZE8P06nw== +metro-file-map@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.8.tgz#a1db1185b6c316904ba6b53d628e5d1323991d79" + integrity sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw== dependencies: anymatch "^3.0.3" debug "^2.2.0" @@ -11171,10 +11183,10 @@ metro-inspector-proxy@0.73.10: ws "^7.5.1" yargs "^17.5.1" -metro-inspector-proxy@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.7.tgz#c067df25056e932002a72a4b45cf7b4b749f808e" - integrity sha512-rNZ/6edTl/1qUekAhAbaFjczMphM50/UjtxiKulo6vqvgn/Mjd9hVqDvVYfAMZXqPvlusD88n38UjVYPkruLSg== +metro-inspector-proxy@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz#6b8678a7461b0b42f913a7881cc9319b4d3cddff" + integrity sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw== dependencies: connect "^3.6.5" debug "^2.2.0" @@ -11243,6 +11255,13 @@ metro-minify-uglify@0.76.9: dependencies: uglify-es "^3.1.9" +metro-minify-uglify@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.9.tgz#e88c30c27911c053e1ee20e12077f0f4cbb154f8" + integrity sha512-MXRrM3lFo62FPISlPfTqC6n9HTEI3RJjDU5SvpE7sJFfJKLx02xXQEltsL/wzvEqK+DhRQ5DEYACTwf5W4Z3yA== + dependencies: + uglify-es "^3.1.9" + metro-react-native-babel-preset@0.73.10: version "0.73.10" resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.10.tgz#304b24bb391537d2c987732cc0a9774be227d3f6" @@ -11331,10 +11350,10 @@ metro-react-native-babel-preset@0.73.5: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-preset@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz#dfe15c040d0918147a8b0e9f530d558287acbb54" - integrity sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw== +metro-react-native-babel-preset@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz#7476efae14363cbdfeeec403b4f01d7348e6c048" + integrity sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg== dependencies: "@babel/core" "^7.20.0" "@babel/plugin-proposal-async-generator-functions" "^7.0.0" @@ -11492,15 +11511,15 @@ metro-react-native-babel-transformer@0.73.5: metro-source-map "0.73.5" nullthrows "^1.1.1" -metro-react-native-babel-transformer@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.7.tgz#ccc7c25b49ee8a1860aafdbf48bfa5441d206f8f" - integrity sha512-W6lW3J7y/05ph3c2p3KKJNhH0IdyxdOCbQ5it7aM2MAl0SM4wgKjaV6EYv9b3rHklpV6K3qMH37UKVcjMooWiA== +metro-react-native-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz#c3a98e1f4cd5faf1e21eba8e004b94a90c4db69b" + integrity sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A== dependencies: "@babel/core" "^7.20.0" babel-preset-fbjs "^3.4.0" hermes-parser "0.12.0" - metro-react-native-babel-preset "0.76.7" + metro-react-native-babel-preset "0.76.8" nullthrows "^1.1.1" metro-react-native-babel-transformer@^0.76.9: @@ -11606,17 +11625,17 @@ metro-source-map@0.73.5: source-map "^0.5.6" vlq "^1.0.0" -metro-source-map@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.7.tgz#9a4aa3a35e1e8ffde9a74cd7ab5f49d9d4a4da14" - integrity sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w== +metro-source-map@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.8.tgz#f085800152a6ba0b41ca26833874d31ec36c5a53" + integrity sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw== dependencies: "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" invariant "^2.2.4" - metro-symbolicate "0.76.7" + metro-symbolicate "0.76.8" nullthrows "^1.1.1" - ob1 "0.76.7" + ob1 "0.76.8" source-map "^0.5.6" vlq "^1.0.0" @@ -11673,13 +11692,13 @@ metro-symbolicate@0.73.5: through2 "^2.0.1" vlq "^1.0.0" -metro-symbolicate@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.7.tgz#1720e6b4ce5676935d7a8a440f25d3f16638e87a" - integrity sha512-p0zWEME5qLSL1bJb93iq+zt5fz3sfVn9xFYzca1TJIpY5MommEaS64Va87lp56O0sfEIvh4307Oaf/ZzRjuLiQ== +metro-symbolicate@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz#f102ac1a306d51597ecc8fdf961c0a88bddbca03" + integrity sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w== dependencies: invariant "^2.2.4" - metro-source-map "0.76.7" + metro-source-map "0.76.8" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" @@ -11721,10 +11740,10 @@ metro-transform-plugins@0.73.10: "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" -metro-transform-plugins@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.7.tgz#5d5f75371706fbf5166288e43ffd36b5e5bd05bc" - integrity sha512-iSmnjVApbdivjuzb88Orb0JHvcEt5veVyFAzxiS5h0QB+zV79w6JCSqZlHCrbNOkOKBED//LqtKbFVakxllnNg== +metro-transform-plugins@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz#d77c28a6547a8e3b72250f740fcfbd7f5408f8ba" + integrity sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" @@ -11887,10 +11906,10 @@ metro@0.73.10: ws "^7.5.1" yargs "^17.5.1" -metro@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.7.tgz#4885917ad28738c7d1e556630e0155f687336230" - integrity sha512-67ZGwDeumEPnrHI+pEDSKH2cx+C81Gx8Mn5qOtmGUPm/Up9Y4I1H2dJZ5n17MWzejNo0XAvPh0QL0CrlJEODVQ== +metro@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.8.tgz#ba526808b99977ca3f9ac5a7432fd02a340d13a6" + integrity sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -11914,22 +11933,22 @@ metro@0.76.7: jest-worker "^27.2.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.76.7" - metro-cache "0.76.7" - metro-cache-key "0.76.7" - metro-config "0.76.7" - metro-core "0.76.7" - metro-file-map "0.76.7" - metro-inspector-proxy "0.76.7" - metro-minify-terser "0.76.7" - metro-minify-uglify "0.76.7" - metro-react-native-babel-preset "0.76.7" - metro-resolver "0.76.7" - metro-runtime "0.76.7" - metro-source-map "0.76.7" - metro-symbolicate "0.76.7" - metro-transform-plugins "0.76.7" - metro-transform-worker "0.76.7" + metro-babel-transformer "0.76.8" + metro-cache "0.76.8" + metro-cache-key "0.76.8" + metro-config "0.76.8" + metro-core "0.76.8" + metro-file-map "0.76.8" + metro-inspector-proxy "0.76.8" + metro-minify-terser "0.76.8" + metro-minify-uglify "0.76.8" + metro-react-native-babel-preset "0.76.8" + metro-resolver "0.76.8" + metro-runtime "0.76.8" + metro-source-map "0.76.8" + metro-symbolicate "0.76.8" + metro-transform-plugins "0.76.8" + metro-transform-worker "0.76.8" mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" @@ -13464,7 +13483,7 @@ promzard@^1.0.0: dependencies: read "^3.0.1" -prop-types@*, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -13680,33 +13699,34 @@ react-native@0.71.0: whatwg-fetch "^3.0.0" ws "^6.2.2" -react-native@0.72.3: - version "0.72.3" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.3.tgz#f8d85ec81c9f3592d091ec8e9ac1694956a72765" - integrity sha512-QqISi+JVmCssNP2FlQ4MWhlc4O/I00MRE1/GClvyZ8h/6kdsyk/sOirkYdZqX3+DrJfI3q+OnyMnsyaXIQ/5tQ== +react-native@0.72.15: + version "0.72.15" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.15.tgz#9b74b0c39ec42befb70d494b535f863c4229ef55" + integrity sha512-UDxOZwCxhwb0dGuvcB/04uWzhDJ8etqW3fMOq6bv35WwEXMgKXXqZpshhMo64UVWm/m2ZmM32ckn5sf1EIqD9Q== dependencies: "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "11.3.5" - "@react-native-community/cli-platform-android" "11.3.5" - "@react-native-community/cli-platform-ios" "11.3.5" + "@react-native-community/cli" "^11.4.1" + "@react-native-community/cli-platform-android" "^11.4.1" + "@react-native-community/cli-platform-ios" "^11.4.1" "@react-native/assets-registry" "^0.72.0" - "@react-native/codegen" "^0.72.6" + "@react-native/codegen" "^0.72.8" "@react-native/gradle-plugin" "^0.72.11" "@react-native/js-polyfills" "^0.72.1" "@react-native/normalize-colors" "^0.72.0" - "@react-native/virtualized-lists" "^0.72.6" + "@react-native/virtualized-lists" "^0.72.8" abort-controller "^3.0.0" anser "^1.4.9" + ansi-regex "^5.0.0" base64-js "^1.1.2" - deprecated-react-native-prop-types "4.1.0" + deprecated-react-native-prop-types "^4.2.3" event-target-shim "^5.0.1" flow-enums-runtime "^0.0.5" invariant "^2.2.4" jest-environment-node "^29.2.1" jsc-android "^250231.0.0" memoize-one "^5.0.0" - metro-runtime "0.76.7" - metro-source-map "0.76.7" + metro-runtime "^0.76.9" + metro-source-map "^0.76.9" mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2"