From 3ab986321e6ed88f25e77d0bdef79978ae665364 Mon Sep 17 00:00:00 2001 From: israx <70438514+israx@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:20:43 -0400 Subject: [PATCH] chore: enable subdomain authentication test in ci (#13733) * wip: hardcode signout uri for poc * chore: expose the prefferedRedirectSignOutUrl * chore: add prefered url change to native file * chore: correct param name * chore: update getRedirectUrl function to consider preferred url * chore: add unit test for the feature * chore: update input type to use the accepted format * chore: review comments * fix: address npm audit issues * chore: update comments, bundle size and rn version * chore: update bundle size limit * chore: update bundle size limit * chore: address coments and rename a param to getRedirecturl funciton * chore: make preid release ready * chore: update yarn.lock * chore: add test and update push-integ branch * chore: revert preid release updates * chore: update sample name * chore: update yarn.lock * chore(auth): add oauth metadata into token orchestrator (#13712) * chore: add oauth metadata into token orchestrator * chore: add unit tests * chore: address feedback * chore: fix unit tests * chore: enable tests in ci --------- Co-authored-by: ManojNB --- .github/integ-config/integ-all.yml | 849 +----------------- .github/workflows/push-integ-test.yml | 2 +- .github/workflows/push-preid-release.yml | 3 +- package.json | 3 + .../providers/cognito/signOut.test.ts | 2 + .../cognito/tokenOrchestrator.test.ts | 2 + .../tokenProvider/tokenOrchestrator.test.ts | 2 + .../utils/oauth/completeOAuthFlow.test.ts | 1 + .../utils/oauth/getRedirectUrl.native.test.ts | 35 + .../utils/oauth/getRedirectUrl.test.ts | 66 ++ .../oauth/handleOAuthSignOut.native.test.ts | 11 +- .../utils/oauth/handleOAuthSignOut.test.ts | 34 +- .../utils/oauth/oAuthSignOutRedirect.test.ts | 1 + packages/auth/src/errors/constants.ts | 17 + .../src/providers/cognito/apis/signOut.ts | 13 +- .../tokenProvider/TokenOrchestrator.ts | 9 + .../cognito/tokenProvider/TokenStore.ts | 18 + .../providers/cognito/tokenProvider/types.ts | 9 + .../cognito/utils/oauth/completeOAuthFlow.ts | 4 + .../utils/oauth/getRedirectUrl.native.ts | 31 +- .../cognito/utils/oauth/getRedirectUrl.ts | 38 +- .../utils/oauth/handleOAuthSignOut.native.ts | 3 +- .../cognito/utils/oauth/handleOAuthSignOut.ts | 14 +- .../utils/oauth/oAuthSignOutRedirect.ts | 3 +- packages/auth/src/types/inputs.ts | 5 +- packages/aws-amplify/package.json | 12 +- packages/rtn-web-browser/package.json | 2 +- yarn.lock | 550 +++--------- 28 files changed, 425 insertions(+), 1314 deletions(-) create mode 100644 packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.native.test.ts create mode 100644 packages/auth/__tests__/providers/cognito/utils/oauth/getRedirectUrl.test.ts diff --git a/.github/integ-config/integ-all.yml b/.github/integ-config/integ-all.yml index 8799414102f..08f8b2bbb5e 100644 --- a/.github/integ-config/integ-all.yml +++ b/.github/integ-config/integ-all.yml @@ -8,851 +8,10 @@ extended_browser_list: &extended_browser_list - edge tests: - # DATASTORE - - test_name: integ_datastore_auth-owner-based-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-based-default - spec: owner-based-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-static-user-pool-groups-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: static-user-pool-groups-default - spec: static-user-pool-groups-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-static-user-pool-groups-operations - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: static-user-pool-groups-operations - spec: static-user-pool-groups-operations - browser: *minimal_browser_list - - test_name: integ_datastore_auth-owner-and-group-different-models-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-and-group-different-models-default - spec: owner-and-group-different-models-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-owner-and-group-same-model-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-and-group-same-model-default - spec: owner-and-group-same-model-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-owner-and-group-same-model-operations - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-and-group-same-model-operations - spec: owner-and-group-same-model-operations - browser: *minimal_browser_list - - test_name: integ_datastore_auth-dynamic-user-pool-groups-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: dynamic-user-pool-groups-default - spec: dynamic-user-pool-groups-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-dynamic-user-pool-groups-owner-based-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: dynamic-user-pool-groups-owner-based-default - spec: dynamic-user-pool-groups-owner-based-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-private-auth-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: private-auth-default - spec: private-auth-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-private-auth-iam - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: private-auth-iam - spec: private-auth-iam - browser: *minimal_browser_list - - test_name: integ_datastore_auth-public-auth-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: public-auth-default - spec: public-auth-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-public-auth-iam - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: public-auth-iam - spec: public-auth-iam - browser: *minimal_browser_list - - test_name: integ_datastore_auth-owner-custom-claim-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-custom-claim-default - spec: owner-custom-claim-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth-owner-custom-field-default - desc: 'DataStore Auth' - framework: react - category: datastore - sample_name: owner-custom-field-default - spec: owner-custom-field-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-based-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-based-default-v2 - spec: owner-based-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-static-user-pool-groups-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/static-user-pool-groups-default-v2 - spec: static-user-pool-groups-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-static-user-pool-groups-operations - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/static-user-pool-groups-operations-v2 - spec: static-user-pool-groups-operations - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-and-group-different-models-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-and-group-different-models-default-v2 - spec: owner-and-group-different-models-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-and-group-same-model-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-and-group-same-model-default-v2 - spec: owner-and-group-same-model-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-and-group-same-model-operations - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-and-group-same-model-operations-v2 - spec: owner-and-group-same-model-operations - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-dynamic-user-pool-groups-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/dynamic-user-pool-groups-default-v2 - spec: dynamic-user-pool-groups-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-dynamic-user-pool-groups-owner-based-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/dynamic-user-pool-groups-owner-based-default-v2 - spec: dynamic-user-pool-groups-owner-based-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-private-auth-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/private-auth-default-v2 - spec: private-auth-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-private-auth-iam - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/private-auth-iam-v2 - spec: private-auth-iam - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-public-auth-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/public-auth-default-v2 - spec: public-auth-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-public-auth-iam - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/public-auth-iam-v2 - spec: public-auth-iam - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-custom-claim-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-custom-claim-default-v2 - spec: owner-custom-claim-default - browser: *minimal_browser_list - - test_name: integ_datastore_auth_v2-owner-custom-field-default - desc: 'DataStore Auth CLI v2' - framework: react - category: datastore - sample_name: v2/owner-custom-field-default-v2 - spec: owner-custom-field-default - browser: *minimal_browser_list - - test_name: integ_react_datastore - desc: 'React DataStore' - framework: react - category: datastore - sample_name: [many-to-many] - spec: many-to-many - browser: *minimal_browser_list - - test_name: integ_react_datastore_v2 - desc: 'React DataStore CLI v2' - framework: react - category: datastore - sample_name: [v2/many-to-many-v2] - spec: many-to-many - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_one_rule - desc: 'React DataStore Multi-Auth - One Rule' - framework: react - category: datastore - sample_name: [multi-auth] - spec: multi-auth-one-rule - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_one_rule_v2 - desc: 'React DataStore Multi-Auth - One Rule CLI v2' - framework: react - category: datastore - sample_name: [v2/multi-auth-v2] - spec: multi-auth-one-rule - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_one_rule_oidc_v2 - desc: 'React DataStore Multi-Auth OIDC - One Rule CLI v2' - framework: react - category: datastore - sample_name: [v2/multi-auth-oidc-v2] - spec: multi-auth-one-rule-oidc - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_two_rules - desc: 'React DataStore Multi-Auth - Two Rules' - framework: react - category: datastore - sample_name: [multi-auth] - spec: multi-auth-two-rules - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_two_rules_v2 - desc: 'React DataStore Multi-Auth - Two Rules CLI v2' - framework: react - category: datastore - sample_name: [v2/multi-auth-v2] - spec: multi-auth-two-rules - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_two_rules_oidc_v2 - desc: 'React DataStore Multi-Auth OIDC - Two Rules CLI v2' - framework: react - category: datastore - sample_name: [v2/multi-auth-oidc-v2] - spec: multi-auth-two-rules-oidc - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_three_plus_rules - desc: 'React DataStore Multi-Auth - Three Plus Rules' - framework: react - category: datastore - sample_name: [multi-auth] - spec: multi-auth-three-plus-rules - browser: *minimal_browser_list - - test_name: integ_react_datastore_multi_auth_three_plus_rules_v2 - desc: 'React DataStore Multi-Auth - Three Plus Rules CLI v2' - framework: react - category: datastore - sample_name: [v2/multi-auth-v2] - spec: multi-auth-three-plus-rules - browser: *minimal_browser_list - - test_name: integ_react_datastore_subs_disabled - desc: 'DataStore - Subs Disabled' - framework: react - category: datastore - sample_name: [subs-disabled] - spec: subs-disabled - browser: *minimal_browser_list - - test_name: integ_react_datastore_subs_disabled_v2 - desc: 'DataStore - Subs Disabled CLI v2' - framework: react - category: datastore - sample_name: [v2/subs-disabled-v2] - spec: subs-disabled - browser: *minimal_browser_list - - test_name: integ_react_datastore_consecutive_saves - desc: 'DataStore - Subs Disabled' - framework: react - category: datastore - sample_name: [consecutive-saves] - spec: consecutive-saves - browser: *minimal_browser_list - - test_name: integ_react_datastore_consecutive_saves_v2 - desc: 'DataStore - Subs Disabled CLI v2' - framework: react - category: datastore - sample_name: [v2/consecutive-saves-v2] - spec: consecutive-saves - browser: *minimal_browser_list - # - test_name: integ_react_datastore_observe_query - # desc: 'DataStore - Observe Query' - # framework: react - # category: datastore - # sample_name: [observe-query] - # spec: observe-query - # browser: *minimal_browser_list - # - test_name: integ_react_datastore_observe_query_v2 - # desc: 'DataStore - Observe Query CLI v2' - # framework: react - # category: datastore - # sample_name: [v2/observe-query-v2] - # spec: observe-query - # browser: *minimal_browser_list - - test_name: integ_react_datastore_schema_drift - desc: 'DataStore - Schema Drift' - framework: react - category: datastore - sample_name: [schema-drift] - spec: schema-drift - browser: *minimal_browser_list - - test_name: integ_react_datastore_background_process_manager - desc: 'DataStore - Background Process Manager' - framework: react - category: datastore - sample_name: [v2/background-process-manager] - spec: background-process-manager - browser: *extended_browser_list - # - test_name: integ_react_datastore_background_process_manager_webkit - # desc: 'DataStore - Background Process Manager' - # framework: react - # category: datastore - # sample_name: [v2/background-process-manager] - # spec: background-process-manager - # browser: [webkit] - - test_name: integ_react_datastore_cpk_related_models - desc: 'DataStore - Custom Primary Key + Related Models' - framework: react - category: datastore - sample_name: [v2/related-models] - spec: cpk-related-models - browser: *extended_browser_list - - test_name: integ_react_datastore_selective_sync - desc: 'DataStore - Selective Sync' - framework: react - category: datastore - sample_name: [selective-sync-v5] - spec: selective-sync-v5 - browser: *minimal_browser_list - - test_name: integ_react_datastore_nested_predicate - desc: 'DataStore - Nested Predicate' - framework: react - category: datastore - sample_name: [nested-predicate] - spec: nested-predicate - browser: *minimal_browser_list - - test_name: integ_react_datastore_docs_examples - desc: 'DataStore - Docs Examples' - framework: react - category: datastore - sample_name: [v2/amplify-docs-examples] - spec: amplify-docs-examples - browser: [chrome] - - test_name: integ_vanilla_js_datastore_basic_crud - desc: 'Vanilla JS + Webpack 4 + DataStore - Basic CRUD' - framework: javascript - category: datastore - sample_name: [basic-crud] - browser: [chrome] - spec: vanilla-js-basic-crud - amplifyjs_dir: true - - test_name: integ_next_datastore_13_basic - desc: 'DataStore - Nextjs 13 build with SWC - basic JS app' - framework: next - category: datastore - sample_name: [next-13-basic] - spec: nextjs-13-basic - browser: *minimal_browser_list - - test_name: integ_next_datastore_13_js - desc: 'DataStore - Nextjs 13 build with SWC - JS app' - framework: next - category: datastore - sample_name: [next-13-js] - spec: nextjs-13 - browser: *minimal_browser_list - - test_name: integ_vite_datastore_basic_crud - desc: 'Vite + DataStore - Basic CRUD' - framework: vite - category: datastore - sample_name: [v2/basic-crud] - spec: vite-basic-crud - browser: [chrome] - - test_name: integ_rollup_datastore_basic_crud - desc: 'Rollup + DataStore - Basic CRUD' - framework: rollup - category: datastore - sample_name: [rollup-basic-crud] - spec: rollup-basic-crud - browser: [chrome] - - # API - - test_name: integ_react_graphql_api - desc: React GraphQL API - framework: react - category: api - sample_name: [graphql] - spec: graphql - browser: *minimal_browser_list - - test_name: integ_react_api_optimistic_ui - desc: React GraphQL API Optimistic UI with Tan/ReactQuery - framework: react - category: api - sample_name: [optimistic-ui] - spec: optimistic-ui - browser: *minimal_browser_list - - test_name: integ_next_api_data_client_gen2 - desc: Next.js Data Client Gen 2 - framework: next - category: api - sample_name: [data-client-gen2] - spec: data-client-gen2 - browser: [chrome] # Issues using Auth category / setting secure cookies in FF using Cypress with a Next.js app. Manual testing in FF works as expected - - test_name: integ_react_rest_api - desc: 'Vite + React REST API' - framework: vite - category: api - sample_name: [rest] - spec: restful - browser: *minimal_browser_list - - # API Gen2 - - test_name: integ_react_rest_api_gen2 - desc: 'GEN2 Vite + React REST API' - framework: vite - category: api - sample_name: [rest] - spec: restful - backend: gen2 - browser: *minimal_browser_list - - # AUTH - - test_name: integ_react_javascript_authentication - desc: 'React Authentication' - framework: react - category: auth - sample_name: [javascript-auth] - spec: functional-auth - browser: *minimal_browser_list - - test_name: integ_react_auth_1_guest_to_authenticated_user - desc: 'Guest to Authenticated User' - framework: react - category: auth - sample_name: [guest-to-auth-user] - spec: guest-to-auth-user - browser: *minimal_browser_list - - test_name: integ_react_typescript_authentication - desc: 'React Typescript Authentication' - framework: react - category: auth - sample_name: [typescript-auth] - spec: functional-auth - browser: *minimal_browser_list - - test_name: integ_react_credentials_different_region - desc: 'React Credentials Different Region' - framework: react - category: auth - sample_name: [credentials-auth] - spec: credentials-auth - browser: *minimal_browser_list - - test_name: integ_react_auth_2_sign_in_after_sign_up - desc: 'Sign In after Sign Up' - framework: react - category: auth - sample_name: [auto-signin-after-signup] - spec: auto-signin-after-signup - browser: *minimal_browser_list - - test_name: integ_react_device_tracking - desc: 'cognito-device-tracking' - framework: react - category: auth - sample_name: [device-tracking] - spec: device-tracking - browser: *minimal_browser_list - - test_name: integ_react_delete_user - desc: 'delete-user' - framework: react - category: auth - sample_name: [delete-user] - spec: delete-user - browser: *minimal_browser_list - - test_name: integ_next_auth_authenticator_and_ssr_page - desc: 'Authenticator and SSR page' - framework: next - category: auth - sample_name: [auth-ssr] - spec: auth-ssr - browser: [chrome] - - test_name: integ_next_auth_authenticator_and_rsc_page - desc: 'Authenticator and RSC page' - framework: next - category: auth - sample_name: [auth-rsc] - spec: auth-rsc - browser: [chrome] - - test_name: integ_next_sign_in_with_oauth - desc: 'Sign-in with the OAuth flow' - framework: next - category: auth - sample_name: [sign-in-with-oauth] - spec: sign-in-with-oauth - browser: [chrome] - - # AUTH GEN2 - - test_name: integ_react_javascript_authentication_gen2 - desc: 'React Authentication' - framework: react - category: auth - sample_name: [javascript-auth] - spec: functional-auth - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_react_auth_1_guest_to_authenticated_user_gen2 - desc: 'Guest to Authenticated User' - framework: react - category: auth - sample_name: [guest-to-auth-user] - spec: guest-to-auth-user - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_react_typescript_authentication_gen2 - desc: 'React Typescript Authentication' - framework: react - category: auth - sample_name: [typescript-auth] - spec: functional-auth - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_react_auth_2_sign_in_after_sign_up_gen2 - desc: 'Sign In after Sign Up' - framework: react - category: auth - sample_name: [auto-signin-after-signup] - spec: auto-signin-after-signup - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_react_device_tracking_gen2 - desc: 'cognito-device-tracking' - framework: react - category: auth - sample_name: [device-tracking] - spec: device-tracking - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_react_delete_user_gen2 - desc: 'delete-user' - framework: react - category: auth - sample_name: [delete-user] - spec: delete-user - browser: *minimal_browser_list - backend: gen2 - - test_name: integ_next_auth_authenticator_and_ssr_page_gen2 - desc: 'Authenticator and SSR page' + - test_name: subdomain_authentication + desc: 'Sign-in with the OAuth flow and subdomains' framework: next category: auth - sample_name: [auth-ssr] - spec: auth-ssr - browser: [chrome] - backend: gen2 - - test_name: integ_next_auth_authenticator_and_rsc_page_gen2 - desc: 'Authenticator and RSC page' - framework: next - category: auth - sample_name: [auth-rsc] - spec: auth-rsc - browser: [chrome] - backend: gen2 - - test_name: integ_next_sign_in_with_oauth_gen2 - desc: 'Sign-in with the OAuth flow' - framework: next - category: auth - sample_name: [sign-in-with-oauth] - spec: sign-in-with-oauth - browser: [chrome] - backend: gen2 - - test_name: integ_vue_sign_in_with_oauth_gen2 - desc: 'Sign-in with the OAuth flow' - framework: vue - category: auth - sample_name: [sign-in-with-oauth] - spec: sign-in-with-oauth - browser: [chrome] - - # DISABLED Angular/Vue tests: - # TODO: delete tests or add custom ui logic to support them. - - # - test_name: integ_angular_auth_angular_authenticator - # desc: 'Angular Authenticator' - # framework: angular - # category: auth - # sample_name: [amplify-authenticator] - # spec: ui-amplify-authenticator - # browser: *minimal_browser_list - # - test_name: integ_angular_auth_angular_custom_authenticator - # desc: 'Angular Custom Authenticator' - # framework: angular - # category: auth - # sample_name: [amplify-authenticator] - # spec: custom-authenticator - # browser: *minimal_browser_list - # - test_name: integ_vue_auth_legacy_vue_authenticator - # desc: 'Legacy Vue Authenticator' - # framework: vue - # category: auth - # sample_name: [amplify-authenticator-legacy] - # spec: authenticator - # browser: *minimal_browser_list - # - test_name: integ_vue_auth_vue_3_authenticator - # desc: 'Vue 3 Authenticator' - # framework: vue - # category: auth - # sample_name: [authenticator-vue3] - # spec: new-ui-authenticator - # browser: *minimal_browser_list - - # DISABLED CDN test: - # TODO: delete this test after making sure CDN won't be supported - - # - test_name: integ_javascript_auth - # desc: 'JavaScript Auth CDN' - # framework: javascript - # category: auth - # sample_name: [auth-cdn] - # spec: auth-cdn - # browser: *minimal_browser_list - # amplifyjs_dir: true - - # ANALYTICS - - test_name: integ_react_analytics_pinpoint - desc: 'Test record and identifyUser calls for pinpoint' - framework: react - category: analytics - sample_name: [pinpoint-test] - spec: pinpoint - # Temp fix: - browser: *minimal_browser_list - - - test_name: integ_react_analytics_personalize_auth - desc: 'Test record API for Personalize with authenticated user' - framework: react - category: analytics - sample_name: [personalize-test] - spec: personalize - # Temp fix: - browser: *minimal_browser_list - - - test_name: integ_react_analytics_personalize_unauth - desc: 'Test record API for Personalize with guest user' - framework: react - category: analytics - sample_name: [personalize-test] - spec: personalize-unauth - # Temp fix: - browser: *minimal_browser_list - - - test_name: integ_react_analytics_kinesis_data_firehose_auth - desc: 'Test record API for KDF with authenticated user' - framework: react - category: analytics - sample_name: [kinesis-firehose-test] - spec: kinesis-firehose - # Temp fix: - browser: *minimal_browser_list - - - test_name: integ_react_analytics_kinesis_data_firehose_unauth - desc: 'Test record API for KDF with guest user' - framework: react - category: analytics - sample_name: [kinesis-firehose-test] - spec: kinesis-firehose-unauth - # Temp fix: - browser: *minimal_browser_list - - # GEO - - test_name: integ_react_geo_display_map - desc: 'Display Map' - framework: react - category: geo - sample_name: [display-map] - spec: display-map - # Temp fix: - browser: [chrome] - - test_name: integ_react_geo_search_outside_map - desc: 'Search Outside Map' - framework: react - category: geo - sample_name: [search-outside-map] - spec: search-outside-map - # Temp fix: - browser: [chrome] - # - test_name: integ_javascript_geo_display_map - # desc: 'Display Map' - # framework: javascript - # category: geo - # sample_name: [display-map-static] - # spec: display-map-static - # browser: *minimal_browser_list - # amplifyjs_dir: true - # - test_name: integ_javascript_geo_search_outside_map - # desc: 'Search Outside Map' - # framework: javascript - # category: geo - # sample_name: [search-outside-map-static] - # spec: search-outside-map-static - # browser: *minimal_browser_list - # amplifyjs_dir: true - - # INTERACTIONS - # - test_name: integ_react_interactions_react_interactions - # desc: 'React Interactions' - # framework: react - # category: interactions - # sample_name: [chatbot-component] - # spec: chatbot-component - # browser: *minimal_browser_list - - test_name: integ_react_interactions_chatbot_v1 - desc: 'Chatbot V1' - framework: react - category: interactions - sample_name: [lex-test-component] - spec: chatbot-v1 - browser: *minimal_browser_list - - test_name: integ_react_interactions_chatbot_v2 - desc: 'Chatbot V2' - framework: react - category: interactions - sample_name: [lex-test-component] - spec: chatbot-v2 - browser: *minimal_browser_list - # - test_name: integ_angular_interactions - # desc: 'Angular Interactions' - # framework: angular - # category: interactions - # sample_name: [chatbot-component] - # spec: chatbot-component - # browser: *minimal_browser_list - # - test_name: integ_vue_interactions_vue_2_interactions - # desc: 'Vue 2 Interactions' - # framework: vue - # category: interactions - # sample_name: [chatbot-component] - # spec: chatbot-component - # browser: [chrome] - # - test_name: integ_vue_interactionsvue_3_interactions - # desc: 'Vue 3 Interactions' - # framework: vue - # category: interactions - # sample_name: [chatbot-component-vue3] - # spec: chatbot-component - # browser: [chrome] - - # PREDICTIONS - - test_name: integ_react_predictions - desc: 'React Predictions' - framework: react - category: predictions - sample_name: [multi-user-translation] - spec: multiuser-translation - browser: *minimal_browser_list - - # PUBSUB - - test_name: integ_react_iot_reconnect - desc: 'PubSub - Reconnection for IoT' - framework: react - category: pubsub - sample_name: [reconnection-iot] - spec: reconnection - # Firefox doesn't support network state management in cypress - browser: [chrome] - - test_name: integ_react_api_reconnect - desc: 'PubSub - Reconnection for API' - framework: react - category: pubsub - sample_name: [reconnection-api] - spec: reconnection - # Firefox doesn't support network state management in cypress - browser: [chrome] - - # STORAGE - - test_name: integ_react_storage - desc: 'React Storage' - framework: react - category: storage - sample_name: [storageApp] - spec: storage - browser: *minimal_browser_list - - test_name: integ_react_storage_multipart_progress - desc: 'React Storage Multi-Part Upload with Progress' - framework: react - category: storage - sample_name: [multi-part-upload-with-progress] - spec: multi-part-upload-with-progress - browser: *minimal_browser_list - - test_name: integ_react_storage_copy - desc: 'React Storage Copy' - framework: react - category: storage - sample_name: [multi-part-copy] - spec: multi-part-copy - browser: *minimal_browser_list - - # GEN2 STORAGE - - test_name: integ_react_storage - desc: 'React Storage Gen2' - framework: react - category: storage - sample_name: [storage-gen2] - spec: storage-gen2 - browser: *minimal_browser_list - - test_name: integ_next_storage - desc: 'Next Storage Auth' - framework: next - category: storage - sample_name: [storage-auth] - spec: storage-client-server - browser: [chrome] # firefox issues with secure cookies in cypress, manual testing works fine - - # INAPPMESSAGING - - test_name: integ_in_app_messaging - desc: 'React InApp Messaging' - framework: react - category: in-app-messaging - sample_name: [in-app-messaging-app] - spec: in-app-messaging - browser: *minimal_browser_list - - # - test_name: integ_duplicate_packages - # desc: 'Duplicate Package Errors' - # framework: react - # category: version-conflict - # sample_name: duplicate-packages - # spec: duplicate-packages - # browser: *minimal_browser_list - - # SSR context isolation - - test_name: integ_ssr_context_isolation - desc: 'SSR Context Isolation' - framework: next - category: ssr-adapter - sample_name: ssr-context-isolation - spec: ssr-context-isolation - yarn_script: ci:ssr-context-isolation + sample_name: [subdomains] + spec: subdomains browser: [chrome] diff --git a/.github/workflows/push-integ-test.yml b/.github/workflows/push-integ-test.yml index 03e43dd2865..7f9d21f6ac0 100644 --- a/.github/workflows/push-integ-test.yml +++ b/.github/workflows/push-integ-test.yml @@ -8,7 +8,7 @@ concurrency: on: push: branches: - - replace-with-your-branch + - test/subdomain-authentication jobs: e2e: diff --git a/.github/workflows/push-preid-release.yml b/.github/workflows/push-preid-release.yml index 9837290ed14..fe9ff6a89a2 100644 --- a/.github/workflows/push-preid-release.yml +++ b/.github/workflows/push-preid-release.yml @@ -34,5 +34,4 @@ jobs: uses: ./.github/workflows/callable-npm-publish-preid.yml # The preid should be detected from the branch name recommending feat/{PREID}/whatever as branch naming pattern # if your branch doesn't follow this pattern, you can override it here for your branch. - with: - preid: ${{ needs.parse-preid.outputs.preid }} + with: preid:${{ needs.parse-preid.outputs.preid }} diff --git a/package.json b/package.json index 06a17c0fdaf..10ed39a194d 100644 --- a/package.json +++ b/package.json @@ -138,5 +138,8 @@ "xml2js": "0.5.0", "tar": "6.2.1", "glob@^10.0.0": "10.3.10" + }, + "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 adae8c494cc..4992b4a3a5c 100644 --- a/packages/auth/__tests__/providers/cognito/signOut.test.ts +++ b/packages/auth/__tests__/providers/cognito/signOut.test.ts @@ -220,6 +220,8 @@ describe('signOut', () => { expect(mockHandleOAuthSignOut).toHaveBeenCalledWith( 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/tokenOrchestrator.test.ts b/packages/auth/__tests__/providers/cognito/tokenOrchestrator.test.ts index 5a31dbf0c74..8906d8d7eed 100644 --- a/packages/auth/__tests__/providers/cognito/tokenOrchestrator.test.ts +++ b/packages/auth/__tests__/providers/cognito/tokenOrchestrator.test.ts @@ -25,6 +25,8 @@ const mockAuthTokenStore = { setKeyValueStorage: jest.fn(), getDeviceMetadata: jest.fn(), clearDeviceMetadata: jest.fn(), + setOAuthMetadata: jest.fn(), + getOAuthMetadata: jest.fn(), }; const mockTokenRefresher = jest.fn(); const validAuthConfig: ResourcesConfig = { diff --git a/packages/auth/__tests__/providers/cognito/tokenProvider/tokenOrchestrator.test.ts b/packages/auth/__tests__/providers/cognito/tokenProvider/tokenOrchestrator.test.ts index e1c25ec86f7..c0853b51f23 100644 --- a/packages/auth/__tests__/providers/cognito/tokenProvider/tokenOrchestrator.test.ts +++ b/packages/auth/__tests__/providers/cognito/tokenProvider/tokenOrchestrator.test.ts @@ -24,6 +24,8 @@ describe('tokenOrchestrator', () => { setKeyValueStorage: jest.fn(), getDeviceMetadata: jest.fn(), clearDeviceMetadata: jest.fn(), + getOAuthMetadata: jest.fn(), + setOAuthMetadata: jest.fn(), }; beforeAll(() => { diff --git a/packages/auth/__tests__/providers/cognito/utils/oauth/completeOAuthFlow.test.ts b/packages/auth/__tests__/providers/cognito/utils/oauth/completeOAuthFlow.test.ts index 78e95120977..8d62c014a94 100644 --- a/packages/auth/__tests__/providers/cognito/utils/oauth/completeOAuthFlow.test.ts +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/completeOAuthFlow.test.ts @@ -13,6 +13,7 @@ import { AuthErrorTypes } from '../../../../../src/types/Auth'; import { OAuthStore } from '../../../../../src/providers/cognito/utils/types'; import { completeOAuthFlow } from '../../../../../src/providers/cognito/utils/oauth/completeOAuthFlow'; +jest.mock('../../../../../src/providers/cognito/tokenProvider'); jest.mock('@aws-amplify/core', () => ({ Hub: { dispatch: jest.fn(), 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..119b4f3c8b4 --- /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 preferredRedirectUrl is not provided', () => { + expect(getRedirectUrl(mockRedirectUrls)).toStrictEqual(mockRedirectUrls[0]); + }); + + it('should return preferredRedirectUrl 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 or https as prefix irrespective if a preferredSignOutUrl 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..4aa66bb823e --- /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 preferredRedirectUrl 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 preferredRedirectUrl 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..f1311f4eca6 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 @@ -48,6 +48,7 @@ describe('handleOAuthSignOut (native)', () => { expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); }); @@ -59,6 +60,7 @@ describe('handleOAuthSignOut (native)', () => { expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).not.toHaveBeenCalled(); }); @@ -70,6 +72,7 @@ describe('handleOAuthSignOut (native)', () => { expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( cognitoConfig, false, + undefined, ); expect(mockCompleteOAuthSignOut).not.toHaveBeenCalled(); }); @@ -81,9 +84,13 @@ describe('handleOAuthSignOut (native)', () => { preferPrivateSession: true, }); mockOAuthSignOutRedirect.mockResolvedValue({ type: 'error' }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut(cognitoConfig, mockStore, undefined); - expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith(cognitoConfig, true); + expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( + cognitoConfig, + true, + undefined, + ); 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 f6fab30158f..57b8955cbb2 100644 --- a/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.test.ts +++ b/packages/auth/__tests__/providers/cognito/utils/oauth/handleOAuthSignOut.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'; import { completeOAuthSignOut } from '../../../../../src/providers/cognito/utils/oauth/completeOAuthSignOut'; import { handleOAuthSignOut } from '../../../../../src/providers/cognito/utils/oauth/handleOAuthSignOut'; import { oAuthSignOutRedirect } from '../../../../../src/providers/cognito/utils/oauth/oAuthSignOutRedirect'; @@ -12,6 +13,7 @@ jest.mock( jest.mock( '../../../../../src/providers/cognito/utils/oauth/oAuthSignOutRedirect', ); +jest.mock('../../../../../src/providers/cognito/tokenProvider'); describe('handleOAuthSignOut', () => { const region = 'us-west-2'; @@ -27,9 +29,13 @@ describe('handleOAuthSignOut', () => { const mockStore = { loadOAuthSignIn: jest.fn(), } as unknown as jest.Mocked; + const mockTokenOrchestrator = { + getOAuthMetadata: jest.fn(), + } as unknown as jest.Mocked; afterEach(() => { mockStore.loadOAuthSignIn.mockReset(); + mockTokenOrchestrator.getOAuthMetadata.mockReset(); mockCompleteOAuthSignOut.mockClear(); mockOAuthSignOutRedirect.mockClear(); }); @@ -39,10 +45,32 @@ describe('handleOAuthSignOut', () => { isOAuthSignIn: true, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); 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 () => { + mockTokenOrchestrator.getOAuthMetadata.mockResolvedValue({ + oauthSignIn: true, + }); + mockStore.loadOAuthSignIn.mockResolvedValue({ + isOAuthSignIn: false, + preferPrivateSession: false, + }); + await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); + + expect(mockCompleteOAuthSignOut).toHaveBeenCalledWith(mockStore); + expect(mockOAuthSignOutRedirect).toHaveBeenCalledWith( + cognitoConfig, + false, + undefined, + ); }); it('should complete OAuth sign out but not redirect', async () => { @@ -50,7 +78,7 @@ describe('handleOAuthSignOut', () => { isOAuthSignIn: false, preferPrivateSession: false, }); - await handleOAuthSignOut(cognitoConfig, mockStore); + await handleOAuthSignOut(cognitoConfig, mockStore, mockTokenOrchestrator); 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 65be0162927..e5866537d77 100644 --- a/packages/auth/src/providers/cognito/apis/signOut.ts +++ b/packages/auth/src/providers/cognito/apis/signOut.ts @@ -60,17 +60,20 @@ export async function signOut(input?: SignOutInput): Promise { } catch (err) { hasOAuthConfig = false; } - if (hasOAuthConfig) { const oAuthStore = new DefaultOAuthStore(defaultStorage); oAuthStore.setAuthConfig(cognitoConfig); - const { type } = - (await handleOAuthSignOut(cognitoConfig, oAuthStore)) ?? {}; + const { type, error } = + (await handleOAuthSignOut( + cognitoConfig, + oAuthStore, + tokenOrchestrator, + input?.oauth?.preferredSignOutUrl, + )) ?? {}; 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. ${error}`, }); } } else { diff --git a/packages/auth/src/providers/cognito/tokenProvider/TokenOrchestrator.ts b/packages/auth/src/providers/cognito/tokenProvider/TokenOrchestrator.ts index 0e16a021969..121875013e2 100644 --- a/packages/auth/src/providers/cognito/tokenProvider/TokenOrchestrator.ts +++ b/packages/auth/src/providers/cognito/tokenProvider/TokenOrchestrator.ts @@ -25,6 +25,7 @@ import { AuthTokenStore, CognitoAuthTokens, DeviceMetadata, + OAuthMetadata, TokenRefresher, } from './types'; @@ -203,4 +204,12 @@ export class TokenOrchestrator implements AuthTokenOrchestrator { clearDeviceMetadata(username?: string): Promise { return this.getTokenStore().clearDeviceMetadata(username); } + + setOAuthMetadata(metadata: OAuthMetadata): Promise { + return this.getTokenStore().setOAuthMetadata(metadata); + } + + getOAuthMetadata(): Promise { + return this.getTokenStore().getOAuthMetadata(); + } } diff --git a/packages/auth/src/providers/cognito/tokenProvider/TokenStore.ts b/packages/auth/src/providers/cognito/tokenProvider/TokenStore.ts index 53ac3228d85..74d6b9400c6 100644 --- a/packages/auth/src/providers/cognito/tokenProvider/TokenStore.ts +++ b/packages/auth/src/providers/cognito/tokenProvider/TokenStore.ts @@ -14,6 +14,7 @@ import { AuthTokenStore, CognitoAuthTokens, DeviceMetadata, + OAuthMetadata, } from './types'; import { TokenProviderErrorCode, assert } from './errorHelpers'; @@ -163,6 +164,7 @@ export class DefaultTokenStore implements AuthTokenStore { this.getKeyValueStorage().removeItem(authKeys.refreshToken), this.getKeyValueStorage().removeItem(authKeys.signInDetails), this.getKeyValueStorage().removeItem(this.getLastAuthUserKey()), + this.getKeyValueStorage().removeItem(authKeys.oauthMetadata), ]); } @@ -222,6 +224,22 @@ export class DefaultTokenStore implements AuthTokenStore { return lastAuthUser; } + + async setOAuthMetadata(metadata: OAuthMetadata): Promise { + const { oauthMetadata: oauthMetadataKey } = await this.getAuthKeys(); + await this.getKeyValueStorage().setItem( + oauthMetadataKey, + JSON.stringify(metadata), + ); + } + + async getOAuthMetadata(): Promise { + const { oauthMetadata: oauthMetadataKey } = await this.getAuthKeys(); + const oauthMetadata = + await this.getKeyValueStorage().getItem(oauthMetadataKey); + + return oauthMetadata && JSON.parse(oauthMetadata); + } } export const createKeysForAuthStorage = ( diff --git a/packages/auth/src/providers/cognito/tokenProvider/types.ts b/packages/auth/src/providers/cognito/tokenProvider/types.ts index f58483a334b..5db7c62f012 100644 --- a/packages/auth/src/providers/cognito/tokenProvider/types.ts +++ b/packages/auth/src/providers/cognito/tokenProvider/types.ts @@ -34,6 +34,7 @@ export const AuthTokenStorageKeys = { randomPasswordKey: 'randomPasswordKey', deviceGroupKey: 'deviceGroupKey', signInDetails: 'signInDetails', + oauthMetadata: 'oauthMetadata', }; export interface AuthTokenStore { @@ -44,6 +45,8 @@ export interface AuthTokenStore { setKeyValueStorage(keyValueStorage: KeyValueStorageInterface): void; getDeviceMetadata(username?: string): Promise; clearDeviceMetadata(username?: string): Promise; + setOAuthMetadata(metadata: OAuthMetadata): Promise; + getOAuthMetadata(): Promise; } export interface AuthTokenOrchestrator { @@ -58,6 +61,8 @@ export interface AuthTokenOrchestrator { clearTokens(): Promise; getDeviceMetadata(username?: string): Promise; clearDeviceMetadata(username?: string): Promise; + setOAuthMetadata(metadata: OAuthMetadata): Promise; + getOAuthMetadata(): Promise; } export interface CognitoUserPoolTokenProviderType extends TokenProvider { @@ -78,3 +83,7 @@ export interface DeviceMetadata { deviceGroupKey?: string; randomPassword: string; } + +export interface OAuthMetadata { + oauthSignIn: boolean; +} diff --git a/packages/auth/src/providers/cognito/utils/oauth/completeOAuthFlow.ts b/packages/auth/src/providers/cognito/utils/oauth/completeOAuthFlow.ts index d9ebc5976a8..f374ed98156 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/completeOAuthFlow.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/completeOAuthFlow.ts @@ -11,6 +11,7 @@ import { Hub, decodeJWT } from '@aws-amplify/core'; import { cacheCognitoTokens } from '../../tokenProvider/cacheTokens'; import { dispatchSignedInHubEvent } from '../dispatchSignedInHubEvent'; +import { tokenOrchestrator } from '../../tokenProvider'; import { createOAuthError } from './createOAuthError'; import { resolveAndClearInflightPromises } from './inflightPromise'; @@ -227,6 +228,9 @@ const completeFlow = async ({ redirectUri: string; state: string; }) => { + await tokenOrchestrator.setOAuthMetadata({ + oauthSignIn: true, + }); await oAuthStore.clearOAuthData(); await oAuthStore.storeOAuthSignIn(true, preferPrivateSession); 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..c6c99d5938c 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.native.ts @@ -12,13 +12,14 @@ import { oAuthSignOutRedirect } from './oAuthSignOutRedirect'; export const handleOAuthSignOut = async ( cognitoConfig: CognitoUserPoolConfig, store: DefaultOAuthStore, + preferredSignOutUrl?: string, ): Promise => { const { isOAuthSignIn, preferPrivateSession } = await store.loadOAuthSignIn(); - if (isOAuthSignIn) { const result = await oAuthSignOutRedirect( cognitoConfig, preferPrivateSession, + preferredSignOutUrl, ); // 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 0e16008e752..27d8d5d7d3f 100644 --- a/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.ts +++ b/packages/auth/src/providers/cognito/utils/oauth/handleOAuthSignOut.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,15 +13,24 @@ import { oAuthSignOutRedirect } from './oAuthSignOutRedirect'; export const handleOAuthSignOut = async ( cognitoConfig: CognitoUserPoolConfig, store: DefaultOAuthStore, + tokenOrchestrator: TokenOrchestrator, + preferredSignOutUrl?: string, ): Promise => { const { isOAuthSignIn } = await store.loadOAuthSignIn(); + const oauthMetadata = await tokenOrchestrator.getOAuthMetadata(); // Clear everything before attempting to visted logout endpoint since the current application // state could be wiped away on redirect await completeOAuthSignOut(store); - if (isOAuthSignIn) { + // The isOAuthSignIn flag is propagated by the oAuthToken store which manages oauth keys in local storage only. + // These keys are used to determine if a user is in an inflight or signedIn oauth states. + // However, this behavior represents an issue when 2 apps share the same set of tokens in Cookie storage because the app that didn't + // start the OAuth will not have access to the oauth keys. + // A heuristic solution is to add oauth metadata to the tokenOrchestrator which will have access to the underlying + // 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, preferredSignOutUrl); } }; diff --git a/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts b/packages/auth/src/providers/cognito/utils/oauth/oAuthSignOutRedirect.ts index 2dd1eda520a..5097c7204d9 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, + preferredSignOutUrl?: string, ): Promise => { assertOAuthConfig(authConfig); const { loginWith, userPoolClientId } = authConfig; const { domain, redirectSignOut } = loginWith.oauth; - const signoutUri = getRedirectUrl(redirectSignOut); + const signoutUri = getRedirectUrl(redirectSignOut, preferredSignOutUrl); 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..ab8bb7a926f 100644 --- a/packages/auth/src/types/inputs.ts +++ b/packages/auth/src/types/inputs.ts @@ -46,7 +46,10 @@ export interface AuthSignInInput< options?: ServiceOptions; } export interface AuthSignOutInput { - global: boolean; + global?: boolean; + oauth?: { + preferredSignOutUrl?: string; + }; } export type AuthProvider = 'Amazon' | 'Apple' | 'Facebook' | 'Google'; diff --git a/packages/aws-amplify/package.json b/packages/aws-amplify/package.json index c23c9eae63b..06cfc9ff752 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,13 +383,13 @@ "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.85 kB" + "limit": "11.84 kB" }, { "name": "[Auth] fetchMFAPreference (Cognito)", @@ -437,7 +437,7 @@ "name": "[Auth] signInWithRedirect (Cognito)", "path": "./dist/esm/auth/index.mjs", "import": "{ signInWithRedirect }", - "limit": "21.15 kB" + "limit": "21.19 kB" }, { "name": "[Auth] fetchUserAttributes (Cognito)", @@ -449,13 +449,13 @@ "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 9a096c7ae52..4a5bf310569 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3334,12 +3334,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" @@ -3364,12 +3364,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" @@ -3400,10 +3400,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" @@ -3421,25 +3421,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" @@ -3489,16 +3488,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@13.6.9": version "13.6.9" @@ -3531,12 +3529,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" @@ -3588,12 +3586,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" @@ -3619,21 +3617,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": @@ -3653,13 +3651,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" @@ -3698,10 +3696,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" @@ -3710,7 +3708,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@13.6.9": @@ -3745,10 +3743,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" @@ -3789,29 +3787,6 @@ prompts "^2.4.0" semver "^6.3.0" -"@react-native-community/cli@11.3.5": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.5.tgz#18ac20ba96182662cf1088cbed20b6065935ddba" - integrity sha512-wMXgKEWe6uesw7vyXKKjx5EDRog0QdXHxdgRguG14AjQRao1+4gXEWq2yyExOTi/GDY6dfJBUGTCwGQxhnk/Lg== - dependencies: - "@react-native-community/cli-clean" "11.3.5" - "@react-native-community/cli-config" "11.3.5" - "@react-native-community/cli-debugger-ui" "11.3.5" - "@react-native-community/cli-doctor" "11.3.5" - "@react-native-community/cli-hermes" "11.3.5" - "@react-native-community/cli-plugin-metro" "11.3.5" - "@react-native-community/cli-server-api" "11.3.5" - "@react-native-community/cli-tools" "11.3.5" - "@react-native-community/cli-types" "11.3.5" - 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 "^6.3.0" - "@react-native-community/cli@13.6.9": version "13.6.9" resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.9.tgz#ba6360b94e0aba9c4001bda256cf7e57e2ecb02c" @@ -3835,6 +3810,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" @@ -3924,7 +3922,7 @@ mkdirp "^0.5.1" nullthrows "^1.1.1" -"@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== @@ -4024,12 +4022,12 @@ resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== -"@react-native/normalize-colors@*", "@react-native/normalize-colors@0.74.86": +"@react-native/normalize-colors@0.74.86": version "0.74.86" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.86.tgz#8dadd294565cdb70b333f790711a019f18bbdd8b" integrity sha512-GGA+nhwrQ1umwnkv7tuGbGIk0oBTeNbG4cUxNQX/CbYW0R98RCNxSbXjfw1XnXZd3lCSFLDxzw154V4hum2pNQ== -"@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== @@ -4047,7 +4045,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== @@ -7315,15 +7313,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" @@ -7333,6 +7322,15 @@ deprecated-react-native-prop-types@^3.0.1: invariant "^2.2.4" prop-types "^15.8.1" +deprecated-react-native-prop-types@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.2.3.tgz#0ef845c1a80ef1636bd09060e4cdf70f9727e5ad" + integrity sha512-2rLTiMKidIFFYpIVM69UnQKngLqQfL6I11Ch8wGSBftS18FUXda+o2we2950X+1dmbgps28niI3qwyH4eX3Z1g== + dependencies: + "@react-native/normalize-colors" "<0.73.0" + invariant "^2.2.4" + prop-types "^15.8.1" + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -9235,7 +9233,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== @@ -9250,11 +9248,6 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -ip@^1.1.5: - version "1.1.9" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" - integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== - is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -10876,15 +10869,6 @@ 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== - dependencies: - "@babel/core" "^7.20.0" - hermes-parser "0.12.0" - nullthrows "^1.1.1" - metro-babel-transformer@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.9.tgz#659ba481d471b5f748c31a8f9397094b629f50ec" @@ -10908,11 +10892,6 @@ metro-cache-key@0.73.10: resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.73.10.tgz#8d63591187d295b62a80aed64a87864b1e9d67a2" integrity sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw== -metro-cache-key@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.7.tgz#70913f43b92b313096673c37532edd07438cb325" - integrity sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ== - metro-cache-key@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.9.tgz#6f17f821d6f306fa9028b7e79445eb18387d03d9" @@ -10931,14 +10910,6 @@ metro-cache@0.73.10: metro-core "0.73.10" rimraf "^3.0.2" -metro-cache@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.7.tgz#e49e51423fa960df4eeff9760d131f03e003a9eb" - integrity sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg== - dependencies: - metro-core "0.76.7" - rimraf "^3.0.2" - metro-cache@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.9.tgz#64326d7a8b470c3886a5e97d5e2a20acab20bc5f" @@ -10967,19 +10938,6 @@ metro-config@0.73.10: metro-core "0.73.10" metro-runtime "0.73.10" -metro-config@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.7.tgz#f0fc171707523aa7d3a9311550872136880558c0" - integrity sha512-CFDyNb9bqxZemiChC/gNdXZ7OQkIwmXzkrEXivcXGbgzlt/b2juCv555GWJHyZSlorwnwJfY3uzAFu4A9iRVfg== - dependencies: - connect "^3.6.5" - cosmiconfig "^5.0.5" - jest-validate "^29.2.1" - metro "0.76.7" - metro-cache "0.76.7" - metro-core "0.76.7" - metro-runtime "0.76.7" - metro-config@0.76.9, metro-config@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.9.tgz#5e60aff9d8894c1ee6bbc5de23b7c8515a0b84a3" @@ -11014,15 +10972,7 @@ metro-core@0.73.10: lodash.throttle "^4.1.1" metro-resolver "0.73.10" -metro-core@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.7.tgz#5d2b8bac2cde801dc22666ad7be1336d1f021b61" - integrity sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw== - dependencies: - lodash.throttle "^4.1.1" - metro-resolver "0.76.7" - -metro-core@0.76.9: +metro-core@0.76.9, metro-core@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.9.tgz#5f55f0fbde41d28957e4f3bb187d32251403f00e" integrity sha512-DSeEr43Wrd5Q7ySfRzYzDwfV89g2OZTQDf1s3exOcLjE5fb7awoLOkA2h46ZzN8NcmbbM0cuJy6hOwF073/yRQ== @@ -11059,26 +11009,6 @@ 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== - dependencies: - anymatch "^3.0.3" - debug "^2.2.0" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - invariant "^2.2.4" - jest-regex-util "^27.0.6" - jest-util "^27.2.0" - jest-worker "^27.2.0" - micromatch "^4.0.4" - node-abort-controller "^3.1.1" - nullthrows "^1.1.1" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - metro-file-map@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.9.tgz#dd3d76ec23fc0ba8cb7b3a3b8075bb09e0b5d378" @@ -11132,17 +11062,6 @@ 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== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - node-fetch "^2.2.0" - ws "^7.5.1" - yargs "^17.6.2" - metro-inspector-proxy@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.9.tgz#0d333e64a7bc9d156d712265faa7b7ae88c775e8" @@ -11161,13 +11080,6 @@ metro-minify-terser@0.73.10: dependencies: terser "^5.15.0" -metro-minify-terser@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.7.tgz#aefac8bb8b6b3a0fcb5ea0238623cf3e100893ff" - integrity sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA== - dependencies: - terser "^5.15.0" - metro-minify-terser@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.9.tgz#3f6271da74dd57179852118443b62cc8dc578aab" @@ -11189,13 +11101,6 @@ metro-minify-uglify@0.73.10: dependencies: uglify-es "^3.1.9" -metro-minify-uglify@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.7.tgz#3e0143786718dcaea4e28a724698d4f8ac199a43" - integrity sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw== - 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" @@ -11291,51 +11196,6 @@ 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== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.4.0" - 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" @@ -11452,17 +11312,6 @@ 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== - 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" - nullthrows "^1.1.1" - metro-react-native-babel-transformer@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.9.tgz#464aab85669ed39f7a59f1fd993a05de9543b09e" @@ -11481,12 +11330,7 @@ metro-resolver@0.73.10: dependencies: absolute-path "^0.0.0" -metro-resolver@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.7.tgz#f00ebead64e451c060f30926ecbf4f797588df52" - integrity sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA== - -metro-resolver@0.76.9: +metro-resolver@0.76.9, metro-resolver@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.9.tgz#79c244784b16ca56076bc1fc816d2ba74860e882" integrity sha512-s86ipNRas9vNR5lChzzSheF7HoaQEmzxBLzwFA6/2YcGmUCowcoyPAfs1yPh4cjMw9F1T4KlMLaiwniGE7HCyw== @@ -11512,14 +11356,6 @@ metro-runtime@0.73.5: "@babel/runtime" "^7.0.0" react-refresh "^0.4.0" -metro-runtime@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.7.tgz#4d75f2dbbcd19a4f01e0d89494e140b0ba8247e4" - integrity sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug== - dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" - metro-runtime@0.76.9, metro-runtime@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.9.tgz#f8ebe150f8896ce1aef5d7f3a52844f8b4f721fb" @@ -11563,21 +11399,7 @@ 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== - dependencies: - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - invariant "^2.2.4" - metro-symbolicate "0.76.7" - nullthrows "^1.1.1" - ob1 "0.76.7" - source-map "^0.5.6" - vlq "^1.0.0" - -metro-source-map@0.76.9: +metro-source-map@0.76.9, metro-source-map@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.9.tgz#0f976ada836717f307427d3830aea52a2ca7ed5f" integrity sha512-q5qsMlu8EFvsT46wUUh+ao+efDsicT30zmaPATNhq+PcTawDbDgnMuUD+FT0bvxxnisU2PWl91RdzKfNc2qPQA== @@ -11629,18 +11451,6 @@ 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== - dependencies: - invariant "^2.2.4" - metro-source-map "0.76.7" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - metro-symbolicate@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.9.tgz#f1627ef6f73bb0c4d48c55684d3c87866a0b0920" @@ -11676,17 +11486,6 @@ 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== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - nullthrows "^1.1.1" - metro-transform-plugins@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.9.tgz#73e34f2014d3df3c336a882b13e541bceb826d37" @@ -11728,24 +11527,6 @@ metro-transform-worker@0.73.10: metro-transform-plugins "0.73.10" nullthrows "^1.1.1" -metro-transform-worker@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.7.tgz#b842d5a542f1806cca401633fc002559b3e3d668" - integrity sha512-cGvELqFMVk9XTC15CMVzrCzcO6sO1lURfcbgjuuPdzaWuD11eEyocvkTX0DPiRjsvgAmicz4XYxVzgYl3MykDw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" - "@babel/types" "^7.20.0" - babel-preset-fbjs "^3.4.0" - metro "0.76.7" - metro-babel-transformer "0.76.7" - metro-cache "0.76.7" - metro-cache-key "0.76.7" - metro-source-map "0.76.7" - metro-transform-plugins "0.76.7" - nullthrows "^1.1.1" - metro-transform-worker@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.9.tgz#281fad223f0447e1ff9cc44d6f7e33dfab9ab120" @@ -11840,61 +11621,7 @@ 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== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - accepts "^1.3.7" - async "^3.2.2" - chalk "^4.0.0" - ci-info "^2.0.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - error-stack-parser "^2.0.6" - graceful-fs "^4.2.4" - hermes-parser "0.12.0" - image-size "^1.0.2" - invariant "^2.2.4" - 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" - mime-types "^2.1.27" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - rimraf "^3.0.2" - serialize-error "^2.1.0" - source-map "^0.5.6" - strip-ansi "^6.0.0" - throat "^5.0.0" - ws "^7.5.1" - yargs "^17.6.2" - -metro@0.76.9: +metro@0.76.9, metro@^0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.9.tgz#605fddf1a54d27762ddba2f636420ae2408862df" integrity sha512-gcjcfs0l5qIPg0lc5P7pj0x7vPJ97tan+OnEjiYLbKjR1D7Oa78CE93YUPyymUPH6q7VzlzMm1UjT35waEkZUw== @@ -12719,11 +12446,6 @@ ob1@0.73.5: resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.5.tgz#b80dc4a6f787044e3d8afde3c2d034ae23d05a86" integrity sha512-MxQH/rCq9/COvgTQbjCldArmesGEidZVVQIn4vDUJvJJ8uMphXOTCBsgWTief2ugvb0WUimIaslKSA+qryFjjQ== -ob1@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.7.tgz#95b68fadafd47e7a6a0ad64cf80f3140dd6d1124" - integrity sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ== - ob1@0.76.9: version "0.76.9" resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.9.tgz#a493e4b83a0fb39200de639804b5d06eed5599dc" @@ -13410,7 +13132,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== @@ -13626,33 +13348,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" @@ -14727,16 +14450,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14814,7 +14528,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -14828,13 +14542,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -15973,7 +15680,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16000,15 +15707,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"