From ed8b16f56c912bd5ce7bf16e799e14fd6c152578 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Wed, 29 Nov 2023 09:45:13 -0600 Subject: [PATCH 01/17] Backend and Frontend Changes For External Idp Changes --- backend/api_handler.py | 15 +- backend/dataall/base/aws/cognito.py | 11 +- .../db => base/services}/__init__.py | 0 .../dataall/base/services/service_provider.py | 16 + .../base/services/service_provider_factory.py | 15 + .../dataall/base/utils/IdentityProvider.py | 8 - backend/dataall/core/__init__.py | 2 +- .../dataall/core/cognito_groups/__init__.py | 1 - .../core/cognito_groups/api/queries.py | 18 - backend/dataall/core/groups/__init__.py | 1 + .../api/__init__.py | 0 .../api/input_types.py | 4 +- backend/dataall/core/groups/api/queries.py | 27 ++ .../api/resolvers.py | 20 +- .../{cognito_groups => groups}/api/types.py | 6 +- .../dataall/core/groups/db}/__init__.py | 0 .../db/group_models.py} | 0 .../ses_email_notification_service.py | 3 +- deploy/configs/frontend_config.py | 62 +++- .../custom_authorizer/__init__.py | 0 .../custom_authorizer/auth_services.py | 59 ++++ .../custom_authorizer_lambda.py | 46 +++ .../custom_authorizer/jwt_services.py | 89 +++++ .../custom_authorizer/requirements.txt | 10 + deploy/stacks/backend_stack.py | 33 +- deploy/stacks/backend_stage.py | 2 + deploy/stacks/cloudfront.py | 53 +-- deploy/stacks/cloudfront_stack.py | 4 +- deploy/stacks/cloudfront_stage.py | 2 + deploy/stacks/lambda_api.py | 117 ++++++- deploy/stacks/pipeline.py | 93 ++--- frontend/package-lock.json | 17 + frontend/package.json | 2 + frontend/src/App.js | 8 +- .../authentication/components/GuestGuard.js | 2 +- .../{LoginAmplify.js => LoginButton.js} | 2 +- .../src/authentication/components/index.js | 2 +- .../authentication/contexts/AuthContext.js | 9 +- .../contexts/CognitoAuthContext.js | 144 +------- .../contexts/GenericAuthContext.js | 319 ++++++++++++++++++ .../contexts/OidcAuthContext.js | 36 ++ frontend/src/authentication/hooks/useAuth.js | 12 +- frontend/src/authentication/hooks/useToken.js | 18 +- .../services/getServiceProviderInfo.js | 14 + frontend/src/authentication/views/Login.js | 12 +- .../components/layout/DefaultSidebar.js | 32 +- .../components/popovers/AccountPopover.js | 2 +- frontend/src/index.js | 9 +- .../components/EnvironmentTeamInviteForm.js | 6 +- .../components/OrganizationTeamInviteForm.js | 6 +- .../components/ReAuthModal.js | 9 +- .../contexts/RequestContext.js | 14 +- frontend/src/services/graphql/Groups/index.js | 2 +- .../src/services/graphql/Groups/listGroups.js | 14 + frontend/src/services/hooks/useGroups.js | 30 +- template_cdk.json | 14 +- tests/conftest.py | 2 +- tests/core/cognito_groups/test_group.py | 25 -- tests/core/groups/__init__.py | 0 tests/core/groups/test_group.py | 32 ++ .../datasets/tasks/test_lf_share_manager.py | 2 +- .../test_s3_access_point_share_manager.py | 2 +- .../tasks/test_s3_bucket_share_manager.py | 2 +- .../test_notification_service.py | 24 +- 64 files changed, 1162 insertions(+), 379 deletions(-) rename backend/dataall/{core/cognito_groups/db => base/services}/__init__.py (100%) create mode 100644 backend/dataall/base/services/service_provider.py create mode 100644 backend/dataall/base/services/service_provider_factory.py delete mode 100644 backend/dataall/base/utils/IdentityProvider.py delete mode 100644 backend/dataall/core/cognito_groups/__init__.py delete mode 100644 backend/dataall/core/cognito_groups/api/queries.py create mode 100644 backend/dataall/core/groups/__init__.py rename backend/dataall/core/{cognito_groups => groups}/api/__init__.py (100%) rename backend/dataall/core/{cognito_groups => groups}/api/input_types.py (82%) create mode 100644 backend/dataall/core/groups/api/queries.py rename backend/dataall/core/{cognito_groups => groups}/api/resolvers.py (76%) rename backend/dataall/core/{cognito_groups => groups}/api/types.py (94%) rename {tests/core/cognito_groups => backend/dataall/core/groups/db}/__init__.py (100%) rename backend/dataall/core/{cognito_groups/db/cognito_group_models.py => groups/db/group_models.py} (100%) create mode 100644 deploy/custom_resources/custom_authorizer/__init__.py create mode 100644 deploy/custom_resources/custom_authorizer/auth_services.py create mode 100644 deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py create mode 100644 deploy/custom_resources/custom_authorizer/jwt_services.py create mode 100644 deploy/custom_resources/custom_authorizer/requirements.txt rename frontend/src/authentication/components/{LoginAmplify.js => LoginButton.js} (89%) create mode 100644 frontend/src/authentication/contexts/GenericAuthContext.js create mode 100644 frontend/src/authentication/contexts/OidcAuthContext.js create mode 100644 frontend/src/authentication/services/getServiceProviderInfo.js create mode 100644 frontend/src/services/graphql/Groups/listGroups.js delete mode 100644 tests/core/cognito_groups/test_group.py create mode 100644 tests/core/groups/__init__.py create mode 100644 tests/core/groups/test_group.py diff --git a/backend/api_handler.py b/backend/api_handler.py index 5840dfac7..c48d69bd1 100644 --- a/backend/api_handler.py +++ b/backend/api_handler.py @@ -11,6 +11,7 @@ ) from dataall.base.api import bootstrap as bootstrap_schema, get_executable_schema +from dataall.base.services.service_provider_factory import ServiceProviderFactory from dataall.core.tasks.service_handlers import Worker from dataall.base.aws.sqs import SqsQueue from dataall.base.aws.parameter_store import ParameterStoreManager @@ -65,7 +66,7 @@ def adapted(obj, info, **kwargs): def get_groups(claims): if not claims: raise ValueError( - 'Received empty claims. ' 'Please verify Cognito authorizer configuration', + 'Received empty claims. ' 'Please verify authorizer configuration', claims, ) groups = list() @@ -74,11 +75,17 @@ def get_groups(claims): groups: list = ( saml_groups.replace('[', '').replace(']', '').replace(', ', ',').split(',') ) - cognito_groups = claims.get('cognito:groups', '').split(',') - groups.extend(cognito_groups) + cognito_groups = claims.get('cognito:groups', '') + if len(cognito_groups): + groups.extend(cognito_groups.split(',')) return groups +def get_custom_groups(user_id): + service_provider = ServiceProviderFactory.get_service_provider_instance() + return service_provider.get_groups_for_user(user_id) + + def handler(event, context): """Sample pure Lambda function @@ -125,6 +132,8 @@ def handler(event, context): log.debug('username is %s', username) try: groups = get_groups(claims) + if (os.environ.get('custom_auth', None)): + groups.extend(get_custom_groups(event)) log.debug('groups are %s', ",".join(groups)) with ENGINE.scoped_session() as session: for group in groups: diff --git a/backend/dataall/base/aws/cognito.py b/backend/dataall/base/aws/cognito.py index 5e63172ab..b7277fdf8 100644 --- a/backend/dataall/base/aws/cognito.py +++ b/backend/dataall/base/aws/cognito.py @@ -2,12 +2,12 @@ import logging import boto3 -from dataall.base.utils.IdentityProvider import IdentityProvider +from dataall.base.services.service_provider import ServiceProvider log = logging.getLogger(__name__) -class Cognito(IdentityProvider): +class Cognito(ServiceProvider): def __init__(self): self.client = boto3.client('cognito-idp', region_name=os.getenv('AWS_REGION', 'eu-west-1')) @@ -38,8 +38,7 @@ def get_user_emailids_from_group(self, groupName): else: return group_email_ids - @staticmethod - def list_cognito_groups(envname: str, region: str): + def list_groups(self, envname: str, region: str): try: parameter_path = f'/dataall/{envname}/cognito/userpool' ssm = boto3.client('ssm', region_name=region) @@ -52,3 +51,7 @@ def list_cognito_groups(envname: str, region: str): ) else: return groups + + def get_groups_for_user(self, user_id): + return [] + diff --git a/backend/dataall/core/cognito_groups/db/__init__.py b/backend/dataall/base/services/__init__.py similarity index 100% rename from backend/dataall/core/cognito_groups/db/__init__.py rename to backend/dataall/base/services/__init__.py diff --git a/backend/dataall/base/services/service_provider.py b/backend/dataall/base/services/service_provider.py new file mode 100644 index 000000000..5c2ad9b80 --- /dev/null +++ b/backend/dataall/base/services/service_provider.py @@ -0,0 +1,16 @@ +import abc + + +class ServiceProvider: + + @abc.abstractmethod + def get_user_emailids_from_group(self, groupName): + raise NotImplementedError + + @abc.abstractmethod + def get_groups_for_user(self, user_id): + raise NotImplementedError + + @abc.abstractmethod + def list_groups(self, envname: str, region: str): + raise NotImplementedError diff --git a/backend/dataall/base/services/service_provider_factory.py b/backend/dataall/base/services/service_provider_factory.py new file mode 100644 index 000000000..ada00c1e2 --- /dev/null +++ b/backend/dataall/base/services/service_provider_factory.py @@ -0,0 +1,15 @@ +import os + +from dataall.base.aws.cognito import Cognito + + +class ServiceProviderFactory: + + @staticmethod + def get_service_provider_instance(): + if (os.environ.get("custom_auth", None)): + # Return instance of your service provider which implements the ServiceProvider interface + # Please take a look at the "Deploy to AWS" , External IDP section for steps + return None + else: + return Cognito() \ No newline at end of file diff --git a/backend/dataall/base/utils/IdentityProvider.py b/backend/dataall/base/utils/IdentityProvider.py deleted file mode 100644 index d11f53f5e..000000000 --- a/backend/dataall/base/utils/IdentityProvider.py +++ /dev/null @@ -1,8 +0,0 @@ -import abc - - -class IdentityProvider: - - @abc.abstractmethod - def get_user_emailids_from_group(self, groupName): - raise NotImplementedError diff --git a/backend/dataall/core/__init__.py b/backend/dataall/core/__init__.py index cf351d59c..6c9811aa5 100644 --- a/backend/dataall/core/__init__.py +++ b/backend/dataall/core/__init__.py @@ -2,7 +2,7 @@ from dataall.core import ( permissions, stacks, - cognito_groups, + groups, environment, organizations, tasks, diff --git a/backend/dataall/core/cognito_groups/__init__.py b/backend/dataall/core/cognito_groups/__init__.py deleted file mode 100644 index cda15ecf1..000000000 --- a/backend/dataall/core/cognito_groups/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from dataall.core.cognito_groups import api diff --git a/backend/dataall/core/cognito_groups/api/queries.py b/backend/dataall/core/cognito_groups/api/queries.py deleted file mode 100644 index c33677b1a..000000000 --- a/backend/dataall/core/cognito_groups/api/queries.py +++ /dev/null @@ -1,18 +0,0 @@ -from dataall.base.api import gql -from dataall.core.cognito_groups.api.resolvers import get_group, list_cognito_groups - -getGroup = gql.QueryField( - name='getGroup', - args=[gql.Argument(name='groupUri', type=gql.NonNullableType(gql.String))], - type=gql.Ref('Group'), - resolver=get_group, -) - -listCognitoGroups = gql.QueryField( - name='listCognitoGroups', - args=[ - gql.Argument(name='filter', type=gql.Ref('CognitoGroupFilter')), - ], - type=gql.ArrayType(gql.Ref('CognitoGroup')), - resolver=list_cognito_groups -) diff --git a/backend/dataall/core/groups/__init__.py b/backend/dataall/core/groups/__init__.py new file mode 100644 index 000000000..89bc8e74d --- /dev/null +++ b/backend/dataall/core/groups/__init__.py @@ -0,0 +1 @@ +from dataall.core.groups import api diff --git a/backend/dataall/core/cognito_groups/api/__init__.py b/backend/dataall/core/groups/api/__init__.py similarity index 100% rename from backend/dataall/core/cognito_groups/api/__init__.py rename to backend/dataall/core/groups/api/__init__.py diff --git a/backend/dataall/core/cognito_groups/api/input_types.py b/backend/dataall/core/groups/api/input_types.py similarity index 82% rename from backend/dataall/core/cognito_groups/api/input_types.py rename to backend/dataall/core/groups/api/input_types.py index 728f353d1..551847a56 100644 --- a/backend/dataall/core/cognito_groups/api/input_types.py +++ b/backend/dataall/core/groups/api/input_types.py @@ -9,8 +9,8 @@ ], ) -CognitoGroupFilter = gql.InputType( - name='CognitoGroupFilter', +ServiceProviderGroupFilter = gql.InputType( + name='ServiceProviderGroupFilter', arguments=[ gql.Argument(name='type', type=gql.String), gql.Argument(name='uri', type=gql.String), diff --git a/backend/dataall/core/groups/api/queries.py b/backend/dataall/core/groups/api/queries.py new file mode 100644 index 000000000..810e6d5fe --- /dev/null +++ b/backend/dataall/core/groups/api/queries.py @@ -0,0 +1,27 @@ +from dataall.base.api import gql +from dataall.core.groups.api.resolvers import get_group, list_groups, get_groups_for_user + +getGroup = gql.QueryField( + name='getGroup', + args=[gql.Argument(name='groupUri', type=gql.NonNullableType(gql.String))], + type=gql.Ref('Group'), + resolver=get_group, +) + +listGroups = gql.QueryField( + name='listGroups', + args=[ + gql.Argument(name='filter', type=gql.Ref('ServiceProviderGroupFilter')), + ], + type=gql.ArrayType(gql.Ref('GroupsInfo')), + resolver=list_groups +) + + +getGroupsForUser = gql.QueryField( + name='getGroupsForUser', + args=[gql.Argument(name='userid', type=gql.NonNullableType(gql.String))], + type=gql.ArrayType(gql.String), + resolver=get_groups_for_user, +) + diff --git a/backend/dataall/core/cognito_groups/api/resolvers.py b/backend/dataall/core/groups/api/resolvers.py similarity index 76% rename from backend/dataall/core/cognito_groups/api/resolvers.py rename to backend/dataall/core/groups/api/resolvers.py index 7040cf569..e8c34ae80 100644 --- a/backend/dataall/core/cognito_groups/api/resolvers.py +++ b/backend/dataall/core/groups/api/resolvers.py @@ -1,8 +1,8 @@ import os import logging -from dataall.base.aws.cognito import Cognito -from dataall.core.cognito_groups.db.cognito_group_models import Group +from dataall.base.services.service_provider_factory import ServiceProviderFactory +from dataall.core.groups.db.group_models import Group from dataall.core.environment.services.environment_service import EnvironmentService from dataall.core.organizations.db.organization_repositories import Organization from dataall.core.permissions.db.tenant_policy_repositories import TenantPolicy @@ -42,12 +42,13 @@ def get_group(context, source, groupUri): return Group(groupUri=groupUri, name=groupUri, label=groupUri) -def list_cognito_groups(context, source, filter: dict = None): +def list_groups(context, source, filter: dict = None): envname = os.getenv('envname', 'local') if envname in ['dkrcompose']: return [{"groupName": 'Engineers'}, {"groupName": 'Scientists'}, {"groupName": 'Requesters'}, {"groupName": 'Producers'}, {"groupName": 'Consumers'}] current_region = os.getenv('AWS_REGION', 'eu-west-1') - groups = Cognito.list_cognito_groups(envname=envname, region=current_region) + service_provider = ServiceProviderFactory.get_service_provider_instance() + groups = service_provider.list_groups(envname=envname, region=current_region) category, category_uri = filter.get("type"), filter.get("uri") if category and category_uri: if category == 'environment': @@ -71,3 +72,14 @@ def list_cognito_groups(context, source, filter: dict = None): if group['GroupName'] not in invited_group_uris: res.append({"groupName": group['GroupName']}) return res + + +def get_groups_for_user(context, source, userid): + envname = os.getenv('envname', 'local') + if envname in ['dkrcompose']: + return [{"groupName": 'Engineers'}, {"groupName": 'Scientists'}, {"groupName": 'Requesters'}, + {"groupName": 'Producers'}, {"groupName": 'Consumers'}] + service_provider = ServiceProviderFactory.get_service_provider_instance() + groups = service_provider.get_groups_for_user(userid) + return groups + diff --git a/backend/dataall/core/cognito_groups/api/types.py b/backend/dataall/core/groups/api/types.py similarity index 94% rename from backend/dataall/core/cognito_groups/api/types.py rename to backend/dataall/core/groups/api/types.py index a735298c4..a910645c2 100644 --- a/backend/dataall/core/cognito_groups/api/types.py +++ b/backend/dataall/core/groups/api/types.py @@ -1,5 +1,5 @@ from dataall.base.api import gql -from dataall.core.cognito_groups.api.resolvers import * +from dataall.core.groups.api.resolvers import * Group = gql.ObjectType( name='Group', @@ -46,8 +46,8 @@ ], ) -CognitoGroup = gql.ObjectType( - name='CognitoGroup', +GroupsInfo = gql.ObjectType( + name='GroupsInfo', fields=[ gql.Field(name='groupName', type=gql.String), ], diff --git a/tests/core/cognito_groups/__init__.py b/backend/dataall/core/groups/db/__init__.py similarity index 100% rename from tests/core/cognito_groups/__init__.py rename to backend/dataall/core/groups/db/__init__.py diff --git a/backend/dataall/core/cognito_groups/db/cognito_group_models.py b/backend/dataall/core/groups/db/group_models.py similarity index 100% rename from backend/dataall/core/cognito_groups/db/cognito_group_models.py rename to backend/dataall/core/groups/db/group_models.py diff --git a/backend/dataall/modules/notifications/services/ses_email_notification_service.py b/backend/dataall/modules/notifications/services/ses_email_notification_service.py index 4a39f908c..ac6a20bc7 100644 --- a/backend/dataall/modules/notifications/services/ses_email_notification_service.py +++ b/backend/dataall/modules/notifications/services/ses_email_notification_service.py @@ -3,6 +3,7 @@ from dataall.base.aws.cognito import Cognito from dataall.base.aws.ses import Ses +from dataall.base.services.service_provider_factory import ServiceProviderFactory from dataall.modules.notifications.services.base_email_notification_service import BaseEmailNotificationService log = logging.getLogger(__name__) @@ -36,7 +37,7 @@ def send_email_task(subject, message, recipient_groups_list, recipient_email_lis # Get instance of the email provider email_provider = SESEmailNotificationService.get_email_provider_instance(recipient_groups_list, recipient_email_list) try: - identityProvider = Cognito() + identityProvider = ServiceProviderFactory.get_service_provider_instance() email_ids_to_send_emails = email_provider.get_email_ids_from_groupList(email_provider.recipient_group_list, identityProvider) diff --git a/deploy/configs/frontend_config.py b/deploy/configs/frontend_config.py index 80b5882d2..75a8e0065 100644 --- a/deploy/configs/frontend_config.py +++ b/deploy/configs/frontend_config.py @@ -11,19 +11,20 @@ def create_react_env_file( internet_facing='True', custom_domain='False', cw_rum_enabled='False', - reauth_ttl='5' + reauth_ttl='5', + custom_auth=None ): ssm = boto3.client('ssm', region_name=region) user_pool_id = ssm.get_parameter(Name=f'/dataall/{envname}/cognito/userpool')[ 'Parameter' - ]['Value'] + ]['Value'] if not custom_auth else '' print(f'Cognito Pool ID: {user_pool_id}') app_client = ssm.get_parameter(Name=f'/dataall/{envname}/cognito/appclient')[ 'Parameter' - ]['Value'] + ]['Value'] if not custom_auth else '' domain = ssm.get_parameter(Name=f'/dataall/{envname}/cognito/domain')['Parameter'][ 'Value' - ] + ] if not custom_auth else '' domain = f'{domain}.auth.{region}.amazoncognito.com' print(f'Cognito Domain: {domain}') api_url = ssm.get_parameter(Name=f'/dataall/{envname}/apiGateway/backendUrl')[ @@ -39,22 +40,25 @@ def create_react_env_file( ] print(f'PivotRole auto-create is enabled: {pivot_role_auto_create}') + user_guide_link = '' if custom_domain == 'False' and internet_facing == 'True': print('Switching to us-east-1 region...') ssm = boto3.client('ssm', region_name='us-east-1') signin_singout_link = ssm.get_parameter( Name=f'/dataall/{envname}/CloudfrontDistributionDomainName' )['Parameter']['Value'] - user_guide_link = ssm.get_parameter( - Name=f'/dataall/{envname}/cloudfront/docs/user/CloudfrontDistributionDomainName' - )['Parameter']['Value'] + if not custom_auth: + user_guide_link = ssm.get_parameter( + Name=f'/dataall/{envname}/cloudfront/docs/user/CloudfrontDistributionDomainName' + )['Parameter']['Value'] else: signin_singout_link = ssm.get_parameter( Name=f'/dataall/{envname}/frontend/custom_domain_name' )['Parameter']['Value'] - user_guide_link = ssm.get_parameter( - Name=f'/dataall/{envname}/userguide/custom_domain_name' - )['Parameter']['Value'] + if not custom_auth: + user_guide_link = ssm.get_parameter( + Name=f'/dataall/{envname}/userguide/custom_domain_name' + )['Parameter']['Value'] print(f'UI: {signin_singout_link}') print(f'USERGUIDE: {user_guide_link}') @@ -63,15 +67,27 @@ def create_react_env_file( file_content = f"""GENERATE_SOURCEMAP=false REACT_APP_GRAPHQL_API={graphql_api_url} REACT_APP_SEARCH_API={search_api_url} -REACT_APP_COGNITO_USER_POOL_ID={user_pool_id} +REACT_APP_USERGUIDE_LINK=https://{user_guide_link} +REACT_APP_ENABLE_PIVOT_ROLE_AUTO_CREATE={pivot_role_auto_create} +REACT_APP_REAUTH_TTL={reauth_ttl} +""" + if custom_auth: + file_content = file_content + f"""REACT_APP_CUSTOM_AUTH={custom_auth.get("provider", "none")} +REACT_APP_CUSTOM_AUTH_URL={custom_auth.get("url", "none")} +REACT_APP_CUSTOM_AUTH_CLIENT_ID={custom_auth.get("client_id", "none")} +REACT_APP_CUSTOM_AUTH_RESP_TYPES={custom_auth.get("response_types", "none")} +REACT_APP_CUSTOM_AUTH_SCOPES={custom_auth.get("scopes", "none")} +REACT_APP_CUSTOM_AUTH_EMAIL_CLAIM_MAPPING={custom_auth.get("claims_mapping_email", "none")} +REACT_APP_CUSTOM_AUTH_USERID_CLAIM_MAPPING={custom_auth.get("claims_mapping_user_id", "none")} +""" + else: + file_content = file_content + f"""REACT_APP_COGNITO_USER_POOL_ID={user_pool_id} REACT_APP_COGNITO_APP_CLIENT_ID={app_client} REACT_APP_COGNITO_DOMAIN={domain} REACT_APP_COGNITO_REDIRECT_SIGNIN=https://{signin_singout_link} REACT_APP_COGNITO_REDIRECT_SIGNOUT=https://{signin_singout_link} -REACT_APP_USERGUIDE_LINK=https://{user_guide_link} -REACT_APP_ENABLE_PIVOT_ROLE_AUTO_CREATE={pivot_role_auto_create} -REACT_APP_REAUTH_TTL={reauth_ttl} """ + print('.env content: \n', file_content) f.write(file_content) @@ -128,6 +144,15 @@ def create_react_env_file( region = os.environ.get('deployment_region', 'eu-west-1') enable_cw_rum = os.environ.get('enable_cw_rum', 'False') reauth_ttl = os.environ.get('reauth_ttl', '5') + custom_auth_properties = {} + if os.environ.get("custom_auth_provider", "None") != "None": + custom_auth_properties["provider"] = os.environ.get("custom_auth_provider", "None") + custom_auth_properties["url"] = os.environ.get("custom_auth_url", "None") + custom_auth_properties["client_id"] = os.environ.get("custom_auth_client_id", "None") + custom_auth_properties["response_types"] = os.environ.get("custom_auth_response_types", "None") + custom_auth_properties["scopes"] = os.environ.get("custom_auth_scopes", "None") + custom_auth_properties["claims_mapping_email"] = os.environ.get("custom_auth_claims_mapping_email", "None") + custom_auth_properties["claims_mapping_user_id"] = os.environ.get("custom_auth_claims_mapping_user_id", "None") print( f'Creating React .env file with params: ' f'(region={region},envname={envname},resource_prefix={resource_prefix}' @@ -135,6 +160,13 @@ def create_react_env_file( f'cw_rum_enabled={enable_cw_rum})' ) create_react_env_file( - region, envname, resource_prefix, internet_facing, custom_domain, enable_cw_rum, reauth_ttl + region, + envname, + resource_prefix, + internet_facing, + custom_domain, + enable_cw_rum, + reauth_ttl, + custom_auth_properties ) print(f'React .env created successfully') diff --git a/deploy/custom_resources/custom_authorizer/__init__.py b/deploy/custom_resources/custom_authorizer/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/deploy/custom_resources/custom_authorizer/auth_services.py b/deploy/custom_resources/custom_authorizer/auth_services.py new file mode 100644 index 000000000..6746c24dd --- /dev/null +++ b/deploy/custom_resources/custom_authorizer/auth_services.py @@ -0,0 +1,59 @@ +import json +import os + +ALLOWED_API_RESOURCE_NAMES = ["graphql", "search"] + + +class AuthServices(): + + # Input example arn:aws:execute-api:us-east-1:012356677990:abc1cv8nko/prod/POST/XXXXXXX/api + # Output example arn:aws:execute-api:us-east-1:012356677990:abc1cv8nko/prod/POST/graphql/api + @staticmethod + def generate_resource_str(resource, api_resource_name): + resource_list = resource.split(':') + api_gateway_arn = resource_list[5].split('/') + api_gateway_arn[3] = api_resource_name + resource_list[5] = "/".join(api_gateway_arn) + return ":".join(resource_list) + + # Generates Policy document containing policy to allow the API invocation for allowed API Endpoints + # Also attaches the claims which are present in the token + # Policy document and principal_id are two required items when using custom authorizer lamda in API gateway + @staticmethod + def generate_policy(verified_claims: dict, effect, incoming_resource_str: str): + # principal_id is a required attribute which needs to be provided by custom authorizer + principal_id = verified_claims['sub'] + + # Attach a claim called 'email'. This is needed by Api Handler + verified_claims['email'] = verified_claims[os.getenv('email')] + + for claim_name, claim_value in verified_claims.items(): + if type(claim_value) is list: + verified_claims.update({claim_name: json.dumps(claim_value)}) + + context = {**verified_claims} + + context.update({ + 'user_id': verified_claims[os.getenv('user_id')], + 'custom_authorizer': 'true', + }) + + policy_statement = [] + + for api_resource_name in ALLOWED_API_RESOURCE_NAMES: + policy_statement.append({ + 'Action': 'execute-api:Invoke', + 'Effect': effect, + 'Resource': AuthServices.generate_resource_str(incoming_resource_str, api_resource_name) + }) + + policy = { + 'principalId': principal_id, + 'policyDocument': { + 'Version': '2012-10-17', + 'Statement': policy_statement + }, + 'context': context + } + + return policy diff --git a/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py new file mode 100644 index 000000000..f47bd4c7d --- /dev/null +++ b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py @@ -0,0 +1,46 @@ +import logging +import os + +from auth_services import AuthServices +from jwt_services import JWTServices + +logger = logging.getLogger() +logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO')) + +""" +Custom Lambda Authorizer Code Performs following, + 1. Fetches the token from Authorizer Header + 2. Validates the JWT Token + 3. Attaches a Policy to invoke graphQL and search APIs and also context containing userid and email needed for processing API in GraphQL Lambda + +Custom Lambda Authorizer is attached to the API Gateway. Check the deploy/stacks/lambda_api.py for more details on deployment +""" + +def lambda_handler(incoming_event, context): + # Get the Token which is sent in the Authorization Header + auth_token = incoming_event['headers']['Authorization'] + if not auth_token: + raise Exception('Unauthorized . Token not found') + + verified_claims = JWTServices.validate_jwt_token(auth_token) + logger.debug(verified_claims) + if not verified_claims: + raise Exception('Unauthorized. Token is not valid') + + effect = 'Allow' + policy = AuthServices.generate_policy(verified_claims, effect, incoming_event['methodArn']) + logger.debug('Generated policy is ', policy) + return policy + + +# the following is useful to make this script executable in both +# AWS Lambda and any other local environments +if __name__ == '__main__': + # for testing locally you can enter the JWT ID Token here + token = "eyJraWQiOiJyUkU3U2RHQTVpT0EyZm9SSmNhTHIzLUd2QUJoM0JLT1ZRVVRVcGNwNjZrIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIwMHU4bXltaGVuMWNXVmhSbjFkNyIsIm5hbWUiOiJUZWphcyBSYWpvcGFkaHllIiwidmVyIjoxLCJpc3MiOiJodHRwczovL291cnlhaG9vLXFhLm9rdGFwcmV2aWV3LmNvbS9vYXV0aDIvYXVzMmMxanp0b0lZSkNNZ28xZDciLCJhdWQiOiIwb2E4NW9jM3F4c3JSSWF1TDFkNyIsImlhdCI6MTY5OTQ1NzkyNSwiZXhwIjoxNjk5NDYxNTI1LCJqdGkiOiJJRC5TOE1ad3VvSmRyb25mMUNBSHlUbU1ueVc4aFBXQlZvUEhRbFU0U1lSQkVnIiwiYW1yIjpbIm1mYSIsIm90cCIsInB3ZCJdLCJpZHAiOiIwMG8xcTJ6YTZxTzFVVUNFQTFkNyIsInByZWZlcnJlZF91c2VybmFtZSI6InRyYWpvcGFkaHllIiwiYXV0aF90aW1lIjoxNjk5NDU3OTI0LCJhdF9oYXNoIjoiSXdiaHhJeG96X051a2FCRkdGdTZKZyIsImNvdW50cnlDb2RlIjoiVVMiLCJsYXN0X25hbWUiOiJSYWpvcGFkaHllIiwicHJpbWFyeV9lbWFpbCI6InRlamFzLnJham9wYWRoeWVAeWFob29pbmMuY29tIiwic2hvcnRfaWQiOiJ0cmFqb3BhZGh5ZSIsImRpc3BsYXlfbmFtZSI6IlRlamFzIFJham9wYWRoeWUiLCJmaXJzdF9uYW1lIjoiVGVqYXMifQ.EWD27A-TC3ouB-qsTQv_omyKpV4s7ZHTspAQIMVoFcsBOuA26tf_Fa1cwi3w1YBNR3C27XB95HB6b3ZQkja8QCgqkQ9ykhfnhzBGqRF3rP-RkCt0jmRpJNY-nkAmdV0-AkA0iPkXtQPFAfr0pMEwGsr529Gn4wvyQZHEa91O3HDypFqGekRfcPJdD-6lfd2csbTwLRsFUcRutZo3FJ7aMwjp8PRLGyaFCvNNFh7uieBEHJ6-qAMz8cwUedL6dadtOa7FTH3mZFgdMBzc_NJV3xlga6nj_4MGbzPSDRDpeWcNV_AWtHccJGp_j4DbwE2z3D43DLuk3qePfSMUcUOYSQ" + event = { + "type": "TOKEN", + "Authorization": token, + "methodArn": "arn:aws:execute-api:us-east-1:012356677990:abc1cv8nko/prod/POST/graphql/api" + } + lambda_handler(event, None) \ No newline at end of file diff --git a/deploy/custom_resources/custom_authorizer/jwt_services.py b/deploy/custom_resources/custom_authorizer/jwt_services.py new file mode 100644 index 000000000..dcab9e87f --- /dev/null +++ b/deploy/custom_resources/custom_authorizer/jwt_services.py @@ -0,0 +1,89 @@ +import json +import os + +import requests +from jose import jwk +from jose.jwt import get_unverified_header, decode, ExpiredSignatureError, JWTError +import logging + +logger = logging.getLogger() +logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO')) + +# Configs required to fetch public keys from JWKS +ISSUER_CONFIGS = { + f'{os.environ.get("custom_auth_url")}': { + "jwks_uri": f'{os.environ.get("custom_auth_jwks_url")}', + "allowed_audiences": f'{os.environ.get("custom_auth_client")}', + }, +} + +issuer_keys = {} + +# instead of re-downloading the public keys every time +# we download them only on cold start +# https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/ +def fetch_public_keys(): + try: + for issuer, issuer_config in ISSUER_CONFIGS.items(): + jwks_response = requests.get(issuer_config["jwks_uri"]) + jwks_response.raise_for_status() + jwks: dict = jwks_response.json() + for key in jwks["keys"]: + value = {"issuer": issuer, "audience": issuer_config["allowed_audiences"], "jwk": jwk.construct(key), + "public_key": jwk.construct(key).public_key()} + issuer_keys.update({key["kid"]: value}) + except Exception as e: + raise Exception(f'Unable to fetch public keys due to {str(e)}') + +fetch_public_keys() + +# Options to validate the JWT token +# Only modification from default is to turn off verify_at_hash as we don't provide the access token for this validation +jwt_options = { + "verify_signature": True, + "verify_aud": True, + "verify_iat": True, + "verify_exp": True, + "verify_nbf": True, + "verify_iss": True, + "verify_sub": True, + "verify_jti": True, + "verify_at_hash": False, + "require_aud": True, + "require_iat": True, + "require_exp": True, + "require_nbf": False, + "require_iss": True, + "require_sub": True, + "require_jti": True, + "require_at_hash": False, + "leeway": 0, +} + +class JWTServices(): + @staticmethod + def validate_jwt_token(jwt_token): + try: + # Decode and verify the JWT token + header = get_unverified_header(jwt_token) + kid = header['kid'] + if kid not in issuer_keys: + logger.info('Public key not found in provided set of keys') + # Retry Fetching the public certificates again in case rotation occurs and lambda has cached the publicKeys + fetch_public_keys() + if kid not in issuer_keys: + raise Exception('Unauthorized') + public_key = issuer_keys.get(kid) + payload = decode(jwt_token, public_key.get('jwk'), algorithms=['RS256', 'HS256'], + issuer=public_key.get('issuer'), audience=public_key.get('audience'), options=jwt_options) + + return payload + except ExpiredSignatureError: + logger.error("JWT token has expired.") + return None + except JWTError as e: + logger.error(f"JWT token validation failed: {str(e)}") + return None + except Exception as e: + logger.error(f'Failed to validate token - {str(e)}') + return None diff --git a/deploy/custom_resources/custom_authorizer/requirements.txt b/deploy/custom_resources/custom_authorizer/requirements.txt new file mode 100644 index 000000000..8d76e193e --- /dev/null +++ b/deploy/custom_resources/custom_authorizer/requirements.txt @@ -0,0 +1,10 @@ +certifi==2022.12.7 +charset-normalizer==3.1.0 +ecdsa==0.18.0 +idna==3.4 +pyasn1==0.5.0 +python-jose==3.3.0 +requests==2.29.0 +rsa==4.9 +six==1.16.0 +urllib3==1.26.15 \ No newline at end of file diff --git a/deploy/stacks/backend_stack.py b/deploy/stacks/backend_stack.py index ffc20ac75..c4995086b 100644 --- a/deploy/stacks/backend_stack.py +++ b/deploy/stacks/backend_stack.py @@ -56,6 +56,7 @@ def __init__( codeartifact_pip_repo_name=None, reauth_config=None, cognito_user_session_timeout_inmins=43200, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -112,18 +113,21 @@ def __init__( **kwargs, ) - cognito_stack = IdpStack( - self, - f'Cognito', - envname=envname, - resource_prefix=resource_prefix, - internet_facing=internet_facing, - tooling_account_id=tooling_account_id, - enable_cw_rum=enable_cw_rum, - vpc=vpc, - cognito_user_session_timeout_inmins=cognito_user_session_timeout_inmins, - **kwargs, - ) + cognito_stack = None + if custom_auth is None: + cognito_stack = IdpStack( + self, + f'Cognito', + envname=envname, + resource_prefix=resource_prefix, + internet_facing=internet_facing, + tooling_account_id=tooling_account_id, + enable_cw_rum=enable_cw_rum, + vpc=vpc, + cognito_user_session_timeout_inmins=cognito_user_session_timeout_inmins, + **kwargs, + ) + sqs_stack = SqsStack( self, @@ -159,12 +163,13 @@ def __init__( ip_ranges=ip_ranges, apig_vpce=apig_vpce, prod_sizing=prod_sizing, - user_pool=cognito_stack.user_pool, + user_pool=cognito_stack.user_pool if custom_auth is None else None, pivot_role_name=self.pivot_role_name, reauth_ttl=reauth_config.get("ttl", 5) if reauth_config else 5, email_notification_sender_email_id=email_sender, email_custom_domain = ses_stack.ses_identity.email_identity_name if ses_stack != None else None, ses_configuration_set = ses_stack.configuration_set.configuration_set_name if ses_stack != None else None, + custom_auth=custom_auth, **kwargs, ) @@ -341,7 +346,7 @@ def __init__( else: self.create_opensearch_stack() - if enable_cw_rum: + if enable_cw_rum and custom_auth is None: CloudWatchRumStack( self, 'CWRumStack', diff --git a/deploy/stacks/backend_stage.py b/deploy/stacks/backend_stage.py index 240f4bf54..d2a38d198 100644 --- a/deploy/stacks/backend_stage.py +++ b/deploy/stacks/backend_stage.py @@ -34,6 +34,7 @@ def __init__( codeartifact_pip_repo_name=None, reauth_config=None, cognito_user_session_timeout_inmins=43200, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -65,6 +66,7 @@ def __init__( codeartifact_pip_repo_name=codeartifact_pip_repo_name, reauth_config=reauth_config, cognito_user_session_timeout_inmins=cognito_user_session_timeout_inmins, + custom_auth=custom_auth, **kwargs, ) diff --git a/deploy/stacks/cloudfront.py b/deploy/stacks/cloudfront.py index 5c3542845..87e6e6869 100644 --- a/deploy/stacks/cloudfront.py +++ b/deploy/stacks/cloudfront.py @@ -32,6 +32,7 @@ def __init__( custom_domain=None, custom_waf_rules=None, tooling_account_id=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -329,20 +330,6 @@ def __init__( string_value=cloudfront_bucket.bucket_name, ) - # Lambda@edge for http_header_redirection - docs_http_headers = os.path.realpath( - os.path.join( - os.path.dirname(__file__), - '..', - 'custom_resources', - 'docs_http_headers', - ) - ) - ( - self.http_header_func, - self.http_header_func_version, - ) = self.build_docs_http_headers(docs_http_headers, envname, resource_prefix) - userguide_docs_distribution, user_docs_bucket = self.build_static_site( f'userguide', acl, @@ -354,7 +341,8 @@ def __init__( ssl_support_method, security_policy, logging_bucket, - ) + custom_auth + ) if custom_auth is None else (None, None) if frontend_alternate_domain: frontend_record = route53.ARecord( self, @@ -365,7 +353,7 @@ def __init__( route53_targets.CloudFrontTarget(cloudfront_distribution) ), ) - if userguide_alternate_domain: + if userguide_alternate_domain and custom_auth != None: userguide_record = route53.ARecord( self, 'CloudFrontUserguideDomain', @@ -383,16 +371,17 @@ def __init__( role_name=f'{resource_prefix}-{envname}-S3DeploymentRole', assumed_by=iam.AccountPrincipal(tooling_account_id), ) + resources_for_cross_account = [] + resources_for_cross_account.append(f'{cloudfront_bucket.bucket_arn}/*') + if custom_auth is None: + resources_for_cross_account.append(f'{user_docs_bucket.bucket_arn}/*') cross_account_deployment_role.add_to_policy( iam.PolicyStatement( actions=[ 's3:Get*', 's3:Put*', ], - resources=[ - f'{cloudfront_bucket.bucket_arn}/*', - f'{user_docs_bucket.bucket_arn}/*', - ], + resources=resources_for_cross_account, ) ) cross_account_deployment_role.add_to_policy( @@ -447,8 +436,8 @@ def __init__( self.frontend_distribution = cloudfront_distribution self.frontend_bucket = cloudfront_bucket - self.user_docs_bucket = user_docs_bucket - self.user_docs_distribution = userguide_docs_distribution + self.user_docs_bucket = user_docs_bucket if custom_auth is not None else None + self.user_docs_distribution = userguide_docs_distribution if custom_auth is not None else None self.cross_account_deployment_role = ( cross_account_deployment_role.role_name if cross_account_deployment_role @@ -506,18 +495,30 @@ def build_static_site( ssl_support_method, security_policy, logging_bucket, + custom_auth ): + # Lambda@edge for http_header_redirection + docs_http_headers = os.path.realpath( + os.path.join( + os.path.dirname(__file__), + '..', + 'custom_resources', + 'docs_http_headers', + ) + ) + ( + self.http_header_func, + self.http_header_func_version, + ) = self.build_docs_http_headers(docs_http_headers, envname, resource_prefix) + parse = auth_at_edge.devdoc_app.get_att('Outputs.ParseAuthHandler').to_string() - refresh = auth_at_edge.devdoc_app.get_att( - 'Outputs.RefreshAuthHandler' - ).to_string() + refresh = auth_at_edge.devdoc_app.get_att('Outputs.RefreshAuthHandler').to_string() signout = auth_at_edge.devdoc_app.get_att('Outputs.SignOutHandler').to_string() check = auth_at_edge.devdoc_app.get_att('Outputs.CheckAuthHandler').to_string() httpheaders = auth_at_edge.devdoc_app.get_att( 'Outputs.HttpHeadersHandler' ).to_string() - if not (parse or refresh or signout or check or httpheaders): raise Exception('Edge functions not found !') diff --git a/deploy/stacks/cloudfront_stack.py b/deploy/stacks/cloudfront_stack.py index eb9454ce9..498de3882 100644 --- a/deploy/stacks/cloudfront_stack.py +++ b/deploy/stacks/cloudfront_stack.py @@ -15,6 +15,7 @@ def __init__( tooling_account_id=None, custom_domain=None, custom_waf_rules=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -25,7 +26,7 @@ def __init__( envname=envname, resource_prefix=resource_prefix, **kwargs, - ) + ) if custom_auth is None else None distro = CloudfrontDistro( self, @@ -36,5 +37,6 @@ def __init__( tooling_account_id=tooling_account_id, custom_domain=custom_domain, custom_waf_rules=custom_waf_rules, + custom_auth=custom_auth, **kwargs, ) diff --git a/deploy/stacks/cloudfront_stage.py b/deploy/stacks/cloudfront_stage.py index 0a808a690..2a57d93df 100644 --- a/deploy/stacks/cloudfront_stage.py +++ b/deploy/stacks/cloudfront_stage.py @@ -15,6 +15,7 @@ def __init__( tooling_account_id=None, custom_domain=None, custom_waf_rules=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -27,6 +28,7 @@ def __init__( tooling_account_id=tooling_account_id, custom_domain=custom_domain, custom_waf_rules=custom_waf_rules, + custom_auth=custom_auth ) Tags.of(cloudfront_stack).add('Application', f'{resource_prefix}-{envname}') diff --git a/deploy/stacks/lambda_api.py b/deploy/stacks/lambda_api.py index b93ab350b..5e63f8a17 100644 --- a/deploy/stacks/lambda_api.py +++ b/deploy/stacks/lambda_api.py @@ -1,4 +1,5 @@ import json +import os from aws_cdk import ( aws_iam as iam, @@ -17,6 +18,7 @@ CfnOutput, Fn, RemovalPolicy, + BundlingOptions ) from aws_cdk.aws_ec2 import ( InterfaceVpcEndpoint, @@ -26,6 +28,7 @@ ) from .pyNestedStack import pyNestedClass +from .solution_bundling import SolutionBundling class LambdaApiStack(pyNestedClass): @@ -51,6 +54,7 @@ def __init__( email_notification_sender_email_id=None, email_custom_domain=None, ses_configuration_set=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -85,6 +89,9 @@ def __init__( self.api_handler_dlq = self.set_dlq(f'{resource_prefix}-{envname}-graphql-dlq') api_handler_sg = self.create_lambda_sgs(envname, "apihandler", resource_prefix, vpc) + api_handler_env = {'envname': envname, 'LOG_LEVEL': 'INFO', 'REAUTH_TTL': str(reauth_ttl)} + if (custom_auth): + api_handler_env['custom_auth'] = custom_auth.get('provider', None) self.api_handler = _lambda.DockerImageFunction( self, 'LambdaGraphQL', @@ -98,7 +105,7 @@ def __init__( security_groups=[api_handler_sg], memory_size=3008 if prod_sizing else 1024, timeout=Duration.minutes(15), - environment={'envname': envname, 'LOG_LEVEL': 'INFO', 'REAUTH_TTL': str(reauth_ttl)}, + environment=api_handler_env, dead_letter_queue_enabled=True, dead_letter_queue=self.api_handler_dlq, on_failure=lambda_destination.SqsDestination(self.api_handler_dlq), @@ -150,6 +157,64 @@ def __init__( ) ) + if custom_auth is not None: + # Create the custom authorizer lambda + custom_authorizer_assets = os.path.realpath( + os.path.join( + os.path.dirname(__file__), + '..', + 'custom_resources', + 'custom_authorizer', + ) + ) + + custom_lambda_env = { + 'envname': envname, + 'LOG_LEVEL': 'DEBUG', + 'custom_auth_provider': custom_auth.get('provider'), + 'custom_auth_url': custom_auth.get('url'), + 'custom_auth_client': custom_auth.get('client_id'), + 'custom_auth_jwks_url': custom_auth.get('jwks_url') + } + + for claims_map in custom_auth.get('claims_mapping', {}): + custom_lambda_env[claims_map] = custom_auth.get('claims_mapping', '').get(claims_map, '') + + self.authorizer_fn = _lambda.Function( + self, + f'CustomAuthorizerFunction-{envname}', + function_name=f'{resource_prefix}-{envname}-custom-authorizer', + handler='custom_authorizer_lambda.lambda_handler', + code=_lambda.Code.from_asset( + path=custom_authorizer_assets, + bundling=BundlingOptions( + image=_lambda.Runtime.PYTHON_3_9.bundling_image, + local=SolutionBundling(source_path=custom_authorizer_assets), + ), + ), + memory_size=512 if prod_sizing else 256, + description='dataall Custom authorizer replacing cognito authorizer', + timeout=Duration.seconds(20), + environment=custom_lambda_env, + vpc=vpc, + runtime=_lambda.Runtime.PYTHON_3_9, + ) + + # Add NAT Connectivity For Custom Authorizer Lambda + self.authorizer_fn.connections.allow_to( + ec2.Peer.any_ipv4(), + ec2.Port.tcp(443), + 'Allow NAT Internet Access SG Egress' + ) + + # Store custom authorizer's ARN in ssm + ssm.StringParameter( + self, + f'{resource_prefix}-{envname}-custom-authorizer-arn', + parameter_name=f'/dataall/{envname}/customauth/customauthorizerarn', + string_value=self.authorizer_fn.function_arn, + ) + # Add VPC Endpoint Connectivity if vpce_connection: for lmbda in [ @@ -191,6 +256,7 @@ def __init__( resource_prefix, vpc, user_pool, + custom_auth ) self.create_sns_topic( @@ -343,6 +409,7 @@ def create_api_gateway( resource_prefix, vpc, user_pool, + custom_auth ): api_deploy_options = apigw.StageOptions( @@ -366,6 +433,7 @@ def create_api_gateway( apig_vpce, resource_prefix, user_pool, + custom_auth ) # Create IP set if IP filtering enabled in CDK.json @@ -425,15 +493,38 @@ def set_up_graphql_api_gateway( apig_vpce, resource_prefix, user_pool, + custom_auth ): - cognito_authorizer = apigw.CognitoUserPoolsAuthorizer( - self, - 'CognitoAuthorizer', - cognito_user_pools=[user_pool], - authorizer_name=f'{resource_prefix}-{envname}-cognito-authorizer', - identity_source='method.request.header.Authorization', - results_cache_ttl=Duration.minutes(60), - ) + if custom_auth is None: + cognito_authorizer = apigw.CognitoUserPoolsAuthorizer( + self, + 'CognitoAuthorizer', + cognito_user_pools=[user_pool], + authorizer_name=f'{resource_prefix}-{envname}-cognito-authorizer', + identity_source='method.request.header.Authorization', + results_cache_ttl=Duration.minutes(60), + ) + else: + #Create a custom Authorizer + custom_authorizer_role = iam.Role(self, + 'custom-auth-role', + assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"), + description="Allow Custom Authorizer to call custom auth lambda" + ) + custom_authorizer_role.add_to_policy(iam.PolicyStatement( + effect=iam.Effect.ALLOW, + actions=['lambda:InvokeFunction'], + resources=[self.authorizer_fn.function_arn] + )) + + custom_authorizer = apigw.RequestAuthorizer( + self, + 'CustomAuthorizer', + handler=self.authorizer_fn, + identity_sources=[apigw.IdentitySource.header('Authorization')], + authorizer_name=f'{resource_prefix}-{envname}-custom-authorizer', + assume_role=custom_authorizer_role + ) if not internet_facing: if apig_vpce: api_vpc_endpoint = InterfaceVpcEndpoint.from_interface_vpc_endpoint_attributes( @@ -540,8 +631,8 @@ def set_up_graphql_api_gateway( ) graphql_proxy.add_method( 'POST', - authorizer=cognito_authorizer, - authorization_type=apigw.AuthorizationType.COGNITO, + authorizer=cognito_authorizer if custom_auth is None else custom_authorizer, + authorization_type=apigw.AuthorizationType.COGNITO if custom_auth is None else apigw.AuthorizationType.CUSTOM, request_validator=request_validator, request_models={'application/json': graphql_validation_model}, ) @@ -580,8 +671,8 @@ def set_up_graphql_api_gateway( ) search_proxy.add_method( 'POST', - authorizer=cognito_authorizer, - authorization_type=apigw.AuthorizationType.COGNITO, + authorizer=cognito_authorizer if custom_auth is None else custom_authorizer, + authorization_type=apigw.AuthorizationType.COGNITO if custom_auth is None else apigw.AuthorizationType.CUSTOM, request_validator=request_validator, request_models={'application/json': search_validation_model}, ) diff --git a/deploy/stacks/pipeline.py b/deploy/stacks/pipeline.py index 538216a4b..6d6f60b97 100644 --- a/deploy/stacks/pipeline.py +++ b/deploy/stacks/pipeline.py @@ -637,14 +637,15 @@ def set_backend_stage(self, target_env, repository_name): prod_sizing=target_env.get('prod_sizing', True), quicksight_enabled=target_env.get('enable_quicksight_monitoring', False), enable_cw_rum=target_env.get('enable_cw_rum', False), - enable_cw_canaries=target_env.get('enable_cw_canaries', False), + enable_cw_canaries=target_env.get('enable_cw_canaries', False) and target_env.get("custom_auth", None) == None, shared_dashboard_sessions=target_env.get('shared_dashboard_sessions', 'anonymous'), enable_opensearch_serverless=target_env.get('enable_opensearch_serverless', False), enable_pivot_role_auto_create=target_env.get('enable_pivot_role_auto_create', False), codeartifact_domain_name=self.codeartifact.codeartifact_domain_name, codeartifact_pip_repo_name=self.codeartifact.codeartifact_pip_repo_name, - reauth_config = target_env.get('reauth_config', None), - cognito_user_session_timeout_inmins=target_env.get('cognito_user_session_timeout_inmins', 43200) + reauth_config =target_env.get('reauth_config', None), + cognito_user_session_timeout_inmins=target_env.get('cognito_user_session_timeout_inmins', 43200), + custom_auth=target_env.get('custom_auth', None) ) ) return backend_stage @@ -724,6 +725,7 @@ def set_cloudfront_stage(self, target_env): resource_prefix=self.resource_prefix, tooling_account_id=self.account, custom_domain=target_env.get('custom_domain'), + custom_auth=target_env.get('custom_auth', None) ) ) front_stage_actions = ( @@ -742,6 +744,13 @@ def set_cloudfront_stage(self, target_env): f'export enable_cw_rum={target_env.get("enable_cw_rum", False)}', f'export resource_prefix={self.resource_prefix}', f'export reauth_ttl={str(target_env.get("reauth_config", {}).get("ttl", 5))}', + f'export custom_auth_provider={str(target_env.get("custom_auth", {}).get("provider", "None"))}', + f'export custom_auth_url={str(target_env.get("custom_auth", {}).get("url", "None"))}', + f'export custom_auth_client_id={str(target_env.get("custom_auth", {}).get("client_id", "None"))}', + f'export custom_auth_response_types={str(target_env.get("custom_auth", {}).get("response_types", "None"))}', + f'export custom_auth_scopes={str(target_env.get("custom_auth", {}).get("scopes", "None"))}', + f'export custom_auth_claims_mapping_email={str(target_env.get("custom_auth", {}).get("claims_mapping", {}).get("email", "None"))}', + f'export custom_auth_claims_mapping_user_id={str(target_env.get("custom_auth", {}).get("claims_mapping", {}).get("user_id", "None"))}', 'mkdir ~/.aws/ && touch ~/.aws/config', 'echo "[profile buildprofile]" > ~/.aws/config', f'echo "role_arn = arn:aws:iam::{target_env["account"]}:role/{self.resource_prefix}-{target_env["envname"]}-S3DeploymentRole" >> ~/.aws/config', @@ -765,7 +774,11 @@ def set_cloudfront_stage(self, target_env): role=self.expanded_codebuild_role.without_policy_updates(), vpc=self.vpc, ), - self.cognito_config_action(target_env), + ) + if target_env.get('custom_auth', None) is None: + front_stage_actions = ( + *front_stage_actions, + self.cognito_config_action(target_env), ) if target_env.get('enable_cw_rum', False): front_stage_actions = ( @@ -775,32 +788,33 @@ def set_cloudfront_stage(self, target_env): self.pipeline.add_wave( f"{self.resource_prefix}-{target_env['envname']}-frontend-stage" ).add_post(*front_stage_actions) - self.pipeline.add_wave( - f"{self.resource_prefix}-{target_env['envname']}-docs-stage" - ).add_post( - pipelines.CodeBuildStep( - id='UpdateDocumentation', - build_environment=codebuild.BuildEnvironment( - build_image=codebuild.LinuxBuildImage.AMAZON_LINUX_2_4, + if target_env.get('custom_auth', None) is None: + self.pipeline.add_wave( + f"{self.resource_prefix}-{target_env['envname']}-docs-stage" + ).add_post( + pipelines.CodeBuildStep( + id='UpdateDocumentation', + build_environment=codebuild.BuildEnvironment( + build_image=codebuild.LinuxBuildImage.AMAZON_LINUX_2_4, + ), + commands=[ + f'aws codeartifact login --tool pip --repository {self.codeartifact.codeartifact_pip_repo_name} --domain {self.codeartifact.codeartifact_domain_name} --domain-owner {self.codeartifact.domain.attr_owner}', + f"make assume-role REMOTE_ACCOUNT_ID={target_env['account']} REMOTE_ROLE={self.resource_prefix}-{target_env['envname']}-S3DeploymentRole", + '. ./.env.assumed_role', + 'aws sts get-caller-identity', + 'export AWS_DEFAULT_REGION=us-east-1', + f"export distributionId=$(aws ssm get-parameter --name /dataall/{target_env['envname']}/cloudfront/docs/user/CloudfrontDistributionId --output text --query 'Parameter.Value')", + f"export bucket=$(aws ssm get-parameter --name /dataall/{target_env['envname']}/cloudfront/docs/user/CloudfrontDistributionBucket --output text --query 'Parameter.Value')", + 'cd documentation/userguide', + 'pip install -r requirements.txt', + 'mkdocs build', + 'aws s3 sync site/ s3://$bucket', + "aws cloudfront create-invalidation --distribution-id $distributionId --paths '/*'", + ], + role=self.expanded_codebuild_role, + vpc=self.vpc, ), - commands=[ - f'aws codeartifact login --tool pip --repository {self.codeartifact.codeartifact_pip_repo_name} --domain {self.codeartifact.codeartifact_domain_name} --domain-owner {self.codeartifact.domain.attr_owner}', - f"make assume-role REMOTE_ACCOUNT_ID={target_env['account']} REMOTE_ROLE={self.resource_prefix}-{target_env['envname']}-S3DeploymentRole", - '. ./.env.assumed_role', - 'aws sts get-caller-identity', - 'export AWS_DEFAULT_REGION=us-east-1', - f"export distributionId=$(aws ssm get-parameter --name /dataall/{target_env['envname']}/cloudfront/docs/user/CloudfrontDistributionId --output text --query 'Parameter.Value')", - f"export bucket=$(aws ssm get-parameter --name /dataall/{target_env['envname']}/cloudfront/docs/user/CloudfrontDistributionBucket --output text --query 'Parameter.Value')", - 'cd documentation/userguide', - 'pip install -r requirements.txt', - 'mkdocs build', - 'aws s3 sync site/ s3://$bucket', - "aws cloudfront create-invalidation --distribution-id $distributionId --paths '/*'", - ], - role=self.expanded_codebuild_role.without_policy_updates(), - vpc=self.vpc, - ), - ) + ) def cw_rum_config_action(self, target_env): return pipelines.CodeBuildStep( @@ -941,15 +955,18 @@ def set_albfront_stage(self, target_env, repository_name): ) def evaluate_post_albfront_stage(self, target_env): - if target_env.get("enable_cw_rum", False): - post=[ - self.cognito_config_action(target_env), - self.cw_rum_config_action(target_env), - ] - else: - post=[ - self.cognito_config_action(target_env), - ] + post = [] + if target_env.get('custom_auth') is None: + post.append(self.cognito_config_action(target_env)) + + if target_env.get('enable_cw_rum', False): + post.append(self.cw_rum_config_action(target_env)) + + if len(post) == 0: + post.append(pipelines.CodeBuildStep( + id='CodeBuildPlaceHolder', + commands=['echo "Skipping Cognito Config Setup as using Custom Auth" '] + )) return post def set_release_stage( diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0ac39772d..ec16633ef 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -39,6 +39,7 @@ "notistack": "^2.0.3", "nprogress": "^0.2.0", "nth-check": "^2.0.1", + "oidc-client-ts": "^2.4.0", "prop-types": "^15.8.1", "react": "^17.0.2", "react-apexcharts": "^1.4.0", @@ -48,6 +49,7 @@ "react-helmet-async": "^1.2.3", "react-icons": "^4.3.1", "react-if": "^4.1.1", + "react-oidc-context": "^2.3.1", "react-redux": "^7.2.6", "react-router": "6.0.0", "react-router-dom": "6.0.0", @@ -48011,6 +48013,15 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, + "oidc-client-ts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", + "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", + "requires": { + "crypto-js": "^4.2.0", + "jwt-decode": "^3.1.2" + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -49440,6 +49451,12 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "react-oidc-context": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-oidc-context/-/react-oidc-context-2.3.1.tgz", + "integrity": "sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==", + "requires": {} + }, "react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", diff --git a/frontend/package.json b/frontend/package.json index 1a29bec83..a2cd31ea9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,6 +47,7 @@ "notistack": "^2.0.3", "nprogress": "^0.2.0", "nth-check": "^2.0.1", + "oidc-client-ts": "^2.4.0", "prop-types": "^15.8.1", "react": "^17.0.2", "react-apexcharts": "^1.4.0", @@ -56,6 +57,7 @@ "react-helmet-async": "^1.2.3", "react-icons": "^4.3.1", "react-if": "^4.1.1", + "react-oidc-context": "^2.3.1", "react-redux": "^7.2.6", "react-router": "6.0.0", "react-router-dom": "6.0.0", diff --git a/frontend/src/App.js b/frontend/src/App.js index c1d61a569..d8d9c2374 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -1,14 +1,14 @@ import { ThemeProvider } from '@mui/material'; import { useRoutes } from 'react-router-dom'; -import { useAuth } from './authentication'; import { GlobalStyles, - SplashScreen, createMaterialTheme, useScrollReset, - useSettings + useSettings, + LoadingScreen } from './design'; import routes from './routes'; +import { useAuth } from './authentication'; export const App = () => { const content = useRoutes(routes); @@ -26,7 +26,7 @@ export const App = () => { return ( - {auth.isInitialized ? content : } + {auth.isInitialized ? content : } ); }; diff --git a/frontend/src/authentication/components/GuestGuard.js b/frontend/src/authentication/components/GuestGuard.js index 99e35accb..b61ce8501 100644 --- a/frontend/src/authentication/components/GuestGuard.js +++ b/frontend/src/authentication/components/GuestGuard.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; import { Navigate } from 'react-router-dom'; -import { useAuth } from '../hooks'; +import { useAuth } from '../hooks/useAuth'; export const GuestGuard = ({ children }) => { const { isAuthenticated } = useAuth(); diff --git a/frontend/src/authentication/components/LoginAmplify.js b/frontend/src/authentication/components/LoginButton.js similarity index 89% rename from frontend/src/authentication/components/LoginAmplify.js rename to frontend/src/authentication/components/LoginButton.js index 8d8f62ffc..c092b7a93 100644 --- a/frontend/src/authentication/components/LoginAmplify.js +++ b/frontend/src/authentication/components/LoginButton.js @@ -1,7 +1,7 @@ import { Button } from '@mui/material'; import { useAuth } from '../hooks'; -export const LoginAmplify = () => { +export const LoginButton = () => { const { login } = useAuth(); return ( diff --git a/frontend/src/authentication/components/index.js b/frontend/src/authentication/components/index.js index 52807e867..f8a6b4dc6 100644 --- a/frontend/src/authentication/components/index.js +++ b/frontend/src/authentication/components/index.js @@ -1,3 +1,3 @@ export * from './AuthGuard'; export * from './GuestGuard'; -export * from './LoginAmplify'; +export * from './LoginButton'; diff --git a/frontend/src/authentication/contexts/AuthContext.js b/frontend/src/authentication/contexts/AuthContext.js index 5c7a5679a..45e0f19e3 100644 --- a/frontend/src/authentication/contexts/AuthContext.js +++ b/frontend/src/authentication/contexts/AuthContext.js @@ -1,6 +1,9 @@ import { CognitoAuthProvider } from './CognitoAuthContext'; import { LocalAuthProvider } from './LocalAuthContext'; +import { OidcAuthProvider } from './OidcAuthContext'; -export const AuthProvider = !process.env.REACT_APP_COGNITO_USER_POOL_ID - ? LocalAuthProvider - : CognitoAuthProvider; +export const AuthProvider = !process.env.REACT_APP_CUSTOM_AUTH + ? !process.env.REACT_APP_COGNITO_USER_POOL_ID + ? LocalAuthProvider + : CognitoAuthProvider + : OidcAuthProvider; diff --git a/frontend/src/authentication/contexts/CognitoAuthContext.js b/frontend/src/authentication/contexts/CognitoAuthContext.js index 5ad3f7cf6..ef101f1f2 100644 --- a/frontend/src/authentication/contexts/CognitoAuthContext.js +++ b/frontend/src/authentication/contexts/CognitoAuthContext.js @@ -1,7 +1,7 @@ import { Auth, Amplify } from 'aws-amplify'; import PropTypes from 'prop-types'; -import { createContext, useEffect, useReducer } from 'react'; -import { SET_ERROR } from 'globalErrors'; +import { GenericAuthProvider } from './GenericAuthContext'; +import { RequestContextProvider } from '../../reauthentication'; Amplify.configure({ Auth: { @@ -23,147 +23,13 @@ Auth.configure({ } }); -const initialState = { - isAuthenticated: false, - isInitialized: false, - user: null, - reAuthStatus: false, - requestInfo: null -}; - -const handlers = { - INITIALIZE: (state, action) => { - const { isAuthenticated, user } = action.payload; - - return { - ...state, - isAuthenticated, - isInitialized: true, - user, - reAuthStatus: false - }; - }, - LOGIN: (state, action) => { - const { user } = action.payload; - - return { - ...state, - isAuthenticated: true, - user - }; - }, - LOGOUT: (state) => ({ - ...state, - isAuthenticated: false, - user: null - }), - REAUTH: (state, action) => { - const { reAuthStatus, requestInfo } = action.payload; - - return { - ...state, - reAuthStatus, - requestInfo - }; - } -}; - -const reducer = (state, action) => - handlers[action.type] ? handlers[action.type](state, action) : state; - -export const CognitoAuthContext = createContext({ - ...initialState, - platform: 'Amplify', - login: () => Promise.resolve(), - logout: () => Promise.resolve(), - reauth: () => Promise.resolve() -}); - export const CognitoAuthProvider = (props) => { const { children } = props; - const [state, dispatch] = useReducer(reducer, initialState); - - useEffect(() => { - const initialize = async () => { - try { - const user = await Auth.currentAuthenticatedUser(); - dispatch({ - type: 'INITIALIZE', - payload: { - isAuthenticated: true, - user: { - id: user.attributes.email, - email: user.attributes.email, - name: user.attributes.email - } - } - }); - } catch (error) { - dispatch({ - type: 'INITIALIZE', - payload: { - isAuthenticated: false, - user: null - } - }); - } - }; - - initialize().catch((e) => dispatch({ type: SET_ERROR, error: e.message })); - }, []); - - const login = async () => { - Auth.federatedSignIn() - .then((user) => { - dispatch({ - type: 'LOGIN', - payload: { - user: { - id: user.attributes.email, - email: user.attributes.email, - name: user.attributes.email - } - } - }); - }) - .catch((e) => { - console.error('Failed to authenticate user', e); - }); - }; - - const reauth = async () => { - await Auth.signOut(); - dispatch({ - type: 'REAUTH', - payload: { - reAuthStatus: false, - requestInfo: null - } - }).catch((e) => { - console.error('Failed to reauth user', e); - }); - }; - - const logout = async () => { - await Auth.signOut(); - dispatch({ - type: 'LOGOUT' - }); - }; return ( - - {children} - + + {children} + ); }; diff --git a/frontend/src/authentication/contexts/GenericAuthContext.js b/frontend/src/authentication/contexts/GenericAuthContext.js new file mode 100644 index 000000000..a018447df --- /dev/null +++ b/frontend/src/authentication/contexts/GenericAuthContext.js @@ -0,0 +1,319 @@ +import { createContext, useEffect, useReducer } from 'react'; +import { SET_ERROR } from '../../globalErrors'; +import PropTypes from 'prop-types'; +import { useAuth } from 'react-oidc-context'; +import { Auth } from 'aws-amplify'; + +const CUSTOM_AUTH = process.env.REACT_APP_CUSTOM_AUTH; + +const initialState = { + isAuthenticated: false, + isInitialized: false, + user: null, + reAuthStatus: false, + requestInfo: null +}; + +const handlers = { + INITIALIZE: (state, action) => { + const { isAuthenticated, user, isInitialized } = action.payload; + + return { + ...state, + isAuthenticated, + isInitialized, + reAuthStatus: false, + user + }; + }, + LOGIN: (state, action) => { + const { user } = action.payload; + return { + ...state, + isAuthenticated: true, + isInitialized: true, + user + }; + }, + LOGOUT: (state) => ({ + ...state, + isAuthenticated: false, + user: null + }), + REAUTH: (state, action) => { + const { reAuthStatus, requestInfo } = action.payload; + + return { + ...state, + reAuthStatus, + requestInfo + }; + } +}; + +const reducer = (state, action) => + handlers[action.type] ? handlers[action.type](state, action) : state; + +export const GenericAuthContext = createContext({ + ...initialState, + platform: CUSTOM_AUTH ? CUSTOM_AUTH : 'Amplify', + login: () => Promise.resolve(), + logout: () => Promise.resolve(), + reauth: () => Promise.resolve() +}); + +export const GenericAuthProvider = (props) => { + const { children } = props; + const [state, dispatch] = useReducer(reducer, initialState); + const auth = useAuth(); + const isLoading = auth ? auth.isLoading : false; + const userProfile = auth ? auth.user : null; + const authEvents = auth ? auth.events : null; + + useEffect(() => { + const initialize = async () => { + try { + const user = await getAuthenticatedUser(); + dispatch({ + type: 'INITIALIZE', + payload: { + isAuthenticated: true, + isInitialized: true, + user: { + id: user.email, + email: user.email, + name: user.email, + id_token: user.id_token, + short_id: user.short_id + } + } + }); + } catch (error) { + if (CUSTOM_AUTH) { + processLoadingStateChange(); + } else { + dispatch({ + type: 'INITIALIZE', + payload: { + isAuthenticated: false, + isInitialized: true, + user: null + } + }); + } + } + }; + + initialize().catch((e) => dispatch({ type: SET_ERROR, error: e.message })); + }, []); + + // useEffect needed for React OIDC context + // Process OIDC state when isLoading state changes + useEffect(() => { + if (CUSTOM_AUTH) { + processLoadingStateChange(); + } + }, [isLoading]); + + // useEffect to process when a user is loaded by react OIDC + // This is triggered when the userProfile ( i.e. auth.user ) is loaded by react OIDC + useEffect(() => { + const processStateChange = async () => { + try { + const user = await getAuthenticatedUser(); + dispatch({ + type: 'LOGIN', + payload: { + user: { + id: user.email, + email: user.email, + name: user.email, + id_token: user.id_token, + short_id: user.short_id + } + } + }); + } catch (error) { + dispatch({ + type: 'LOGOUT', + payload: { + isAuthenticated: false, + user: null + } + }); + } + }; + + if (CUSTOM_AUTH) { + processStateChange().catch((e) => + dispatch({ type: SET_ERROR, error: e.message }) + ); + } + }, [userProfile]); + + // useEffect to process auth events generated by react OIDC + // This is used to logout user when the token expires + useEffect(() => { + if (CUSTOM_AUTH) { + return auth.events.addAccessTokenExpired(() => { + auth.signoutSilent().then((r) => { + dispatch({ + type: 'LOGOUT', + payload: { + isAuthenticated: false, + user: null + } + }); + window.localStorage.removeItem('user_groups'); + }); + }); + } + }, [authEvents]); + + const getAuthenticatedUser = async () => { + if (CUSTOM_AUTH) { + if (!auth.user) throw Error('User not initialized'); + return { + email: await getDataFromClaimsMapping( + process.env.REACT_APP_CUSTOM_AUTH_EMAIL_CLAIM_MAPPING, + auth.user.profile + ), + id_token: auth.user.id_token, + short_id: await getDataFromClaimsMapping( + process.env.REACT_APP_CUSTOM_AUTH_USERID_CLAIM_MAPPING, + auth.user.profile + ) + }; + } else { + const user = await Auth.currentAuthenticatedUser(); + return { + email: user.attributes.email, + id_token: user.signInUserSession.idToken.jwtToken, + short_id: 'none' + }; + } + }; + + // Used to map custom profile claims sent from the IDP + // This mapping is provided in the cdk.json at the time of deployment + const getDataFromClaimsMapping = async (mappingStr, userProfile) => { + // mapping str consist of path to from the user object to the claim information + // For e.g. profile.email or profile.primary_email, etc + const claimsList = mappingStr.split('.'); + let _userProfile = userProfile; + for (const claim of claimsList) { + _userProfile = _userProfile[claim]; + } + return _userProfile; + }; + + // Function to process OIDC State when it transitions from false to true + function processLoadingStateChange() { + if (isLoading) { + dispatch({ + type: 'INITIALIZE', + payload: { + isAuthenticated: false, + isInitialized: false, // setting to false when the OIDC State is loading + user: null + } + }); + } else { + dispatch({ + type: 'INITIALIZE', + payload: { + isAuthenticated: false, + isInitialized: true, // setting to true when the OIDC state is completely loaded + user: null + } + }); + } + } + + const login = async () => { + try { + if (CUSTOM_AUTH) { + await auth.signinRedirect(); + } else { + await Auth.federatedSignIn(); + } + } catch (error) { + console.error('Failed to authenticate user', error); + } + }; + + const logout = async () => { + try { + if (CUSTOM_AUTH) { + await auth.signoutSilent(); + dispatch({ + type: 'LOGOUT', + payload: { + isAuthenticated: false, + user: null + } + }); + window.localStorage.removeItem('user_groups'); + } else { + await Auth.signOut(); + dispatch({ + type: 'LOGOUT', + payload: { + isAuthenticated: false, + user: null + } + }); + } + } catch (error) { + console.error('Failed to signout', error); + } + }; + + const reauth = async () => { + if (CUSTOM_AUTH) { + try { + auth.signoutSilent().then((r) => { + dispatch({ + type: 'REAUTH', + payload: { + reAuthStatus: false, + requestInfo: null + } + }); + window.localStorage.removeItem('user_groups'); + }); + } catch (error) { + console.error('Failed to ReAuth', error); + } + } else { + await Auth.signOut(); + dispatch({ + type: 'REAUTH', + payload: { + reAuthStatus: false, + requestInfo: null + } + }); + } + }; + + return ( + + {children} + + ); +}; + +GenericAuthContext.propTypes = { + children: PropTypes.node.isRequired +}; diff --git a/frontend/src/authentication/contexts/OidcAuthContext.js b/frontend/src/authentication/contexts/OidcAuthContext.js new file mode 100644 index 000000000..9f90e67c3 --- /dev/null +++ b/frontend/src/authentication/contexts/OidcAuthContext.js @@ -0,0 +1,36 @@ +import { AuthProvider, useAuth } from 'react-oidc-context'; +import PropTypes from 'prop-types'; +import { WebStorageStateStore } from 'oidc-client-ts'; +import { GenericAuthProvider } from './GenericAuthContext'; +import { RequestContextProvider } from '../../reauthentication'; + +const oidcConfig = { + authority: process.env.REACT_APP_CUSTOM_AUTH_URL, + client_id: process.env.REACT_APP_CUSTOM_AUTH_CLIENT_ID, + redirect_uri: `${window.location.origin}`, + response_type: process.env.REACT_APP_CUSTOM_AUTH_RESP_TYPES, + scope: process.env.REACT_APP_CUSTOM_AUTH_SCOPES, + automaticSilentRenew: false, + userStore: new WebStorageStateStore({ store: window.localStorage }), + // onSigninCallback function is used to remove the query parameters from the URL + // https://www.npmjs.com/package/react-oidc-context#:~:text=an%20implementation%20of-,onSigninCallback,-to%20oidcConfig%20to + onSigninCallback: (_user) => { + window.history.replaceState({}, document.title, window.location.pathname); + } +}; + +export const OidcAuthProvider = (props) => { + const { children } = props; + + return ( + + + {children} + + + ); +}; + +OidcAuthProvider.propTypes = { + children: PropTypes.node.isRequired +}; diff --git a/frontend/src/authentication/hooks/useAuth.js b/frontend/src/authentication/hooks/useAuth.js index 975f24e08..ad1477065 100644 --- a/frontend/src/authentication/hooks/useAuth.js +++ b/frontend/src/authentication/hooks/useAuth.js @@ -1,10 +1,12 @@ +import { GenericAuthContext } from '../contexts/GenericAuthContext'; import { useContext } from 'react'; -import { CognitoAuthContext } from '../contexts/CognitoAuthContext'; import { LocalAuthContext } from '../contexts/LocalAuthContext'; -export const useAuth = () => - useContext( - !process.env.REACT_APP_COGNITO_USER_POOL_ID +export const useAuth = () => { + return useContext( + !process.env.REACT_APP_COGNITO_USER_POOL_ID && + !process.env.REACT_APP_CUSTOM_AUTH ? LocalAuthContext - : CognitoAuthContext + : GenericAuthContext ); +}; diff --git a/frontend/src/authentication/hooks/useToken.js b/frontend/src/authentication/hooks/useToken.js index cffbf6d48..22c51dcb5 100644 --- a/frontend/src/authentication/hooks/useToken.js +++ b/frontend/src/authentication/hooks/useToken.js @@ -15,9 +15,21 @@ export const useToken = () => { setToken('localToken'); } else { try { - const session = await Auth.currentSession(); - const t = await session.getIdToken().getJwtToken(); - setToken(t); + if (process.env.REACT_APP_CUSTOM_AUTH) { + try { + if (!auth.user) { + await auth.signinSilent(); + } + const t = auth.user.id_token; + setToken(t); + } catch (error) { + if (!auth) throw Error('User Token Not Found !'); + } + } else { + const session = await Auth.currentSession(); + const t = await session.getIdToken().getJwtToken(); + setToken(t); + } } catch (error) { auth.dispatch({ type: 'LOGOUT' diff --git a/frontend/src/authentication/services/getServiceProviderInfo.js b/frontend/src/authentication/services/getServiceProviderInfo.js new file mode 100644 index 000000000..9bc41dedb --- /dev/null +++ b/frontend/src/authentication/services/getServiceProviderInfo.js @@ -0,0 +1,14 @@ +import { gql } from 'apollo-boost'; + +export const getGroupsForUser = (userid) => { + return { + variables: { + userid + }, + query: gql` + query getGroupsForUser($userid: String!) { + getGroupsForUser(userid: $userid) + } + ` + }; +}; diff --git a/frontend/src/authentication/views/Login.js b/frontend/src/authentication/views/Login.js index d178e4e7e..3d04bcce1 100644 --- a/frontend/src/authentication/views/Login.js +++ b/frontend/src/authentication/views/Login.js @@ -1,8 +1,8 @@ import { Box, Card, CardContent, Container, Typography } from '@mui/material'; import { Helmet } from 'react-helmet-async'; -import { LoginAmplify } from '../components'; -import { useAuth } from '../hooks'; +import { LoginButton } from '../components'; import { Logo } from 'design'; +import { useAuth } from '../hooks'; const platformIcons = { Amplify: '/static/icons/amplify.svg' @@ -72,7 +72,11 @@ export const Login = () => { } }} > - Auth platform + {!process.env.REACT_APP_CUSTOM_AUTH ? ( + Auth platform + ) : ( + <> + )} { mt: 3 }} > - {platform === 'Amplify' && } + diff --git a/frontend/src/design/components/layout/DefaultSidebar.js b/frontend/src/design/components/layout/DefaultSidebar.js index 89e643985..18ea7ea4c 100644 --- a/frontend/src/design/components/layout/DefaultSidebar.js +++ b/frontend/src/design/components/layout/DefaultSidebar.js @@ -188,21 +188,25 @@ export const DefaultSidebar = ({ openDrawer, onOpenDrawerChange }) => { - - - + {process.env.REACT_APP_CUSTOM_AUTH ? ( +
+ ) : ( + + + + -
+ )}
); diff --git a/frontend/src/design/components/popovers/AccountPopover.js b/frontend/src/design/components/popovers/AccountPopover.js index 1f02e121c..58c5e61b3 100644 --- a/frontend/src/design/components/popovers/AccountPopover.js +++ b/frontend/src/design/components/popovers/AccountPopover.js @@ -12,10 +12,10 @@ import { import { useSnackbar } from 'notistack'; import { useRef, useState } from 'react'; import { Link as RouterLink, useNavigate } from 'react-router-dom'; -import { useAuth } from 'authentication'; import { useGroups } from 'services'; import { CogIcon } from '../../icons'; import { TextAvatar } from '../TextAvatar'; +import { useAuth } from '../../../authentication'; export const AccountPopover = () => { const anchorRef = useRef(null); diff --git a/frontend/src/index.js b/frontend/src/index.js index 31d61211f..b2c778d00 100644 --- a/frontend/src/index.js +++ b/frontend/src/index.js @@ -14,7 +14,6 @@ import { store } from './globalErrors'; import { reportWebVitals } from './reportWebVitals'; import * as serviceWorker from './serviceWorker'; import { SnackbarProvider } from 'notistack'; -import { RequestContextProvider } from './reauthentication'; ReactDOM.render( @@ -25,11 +24,9 @@ ReactDOM.render( - - - - - + + + diff --git a/frontend/src/modules/Environments/components/EnvironmentTeamInviteForm.js b/frontend/src/modules/Environments/components/EnvironmentTeamInviteForm.js index 3779f0c52..3e57ef0ec 100644 --- a/frontend/src/modules/Environments/components/EnvironmentTeamInviteForm.js +++ b/frontend/src/modules/Environments/components/EnvironmentTeamInviteForm.js @@ -23,7 +23,7 @@ import PropTypes from 'prop-types'; import React, { useCallback, useEffect, useState } from 'react'; import * as Yup from 'yup'; import { SET_ERROR, useDispatch } from 'globalErrors'; -import { useClient, listCognitoGroups } from 'services'; +import { useClient, listGroups } from 'services'; import { inviteGroupOnEnvironment, listEnvironmentGroupInvitationPermissions @@ -49,10 +49,10 @@ export const EnvironmentTeamInviteForm = (props) => { const fetchGroups = useCallback(async () => { try { setLoadingGroups(true); - const response = await client.query(listCognitoGroups({ filter })); + const response = await client.query(listGroups({ filter })); if (!response.errors) { setGroupOptions( - response.data.listCognitoGroups.map((g) => ({ + response.data.listGroups.map((g) => ({ ...g, value: g.groupName, label: g.groupName diff --git a/frontend/src/modules/Organizations/components/OrganizationTeamInviteForm.js b/frontend/src/modules/Organizations/components/OrganizationTeamInviteForm.js index 7dd089b6f..7915ac5ed 100644 --- a/frontend/src/modules/Organizations/components/OrganizationTeamInviteForm.js +++ b/frontend/src/modules/Organizations/components/OrganizationTeamInviteForm.js @@ -22,7 +22,7 @@ import PropTypes from 'prop-types'; import React, { useCallback, useEffect, useState } from 'react'; import * as Yup from 'yup'; import { SET_ERROR, useDispatch } from 'globalErrors'; -import { listCognitoGroups, useClient } from 'services'; +import { listGroups, useClient } from 'services'; import { inviteGroupToOrganization } from '../services'; export const OrganizationTeamInviteForm = (props) => { @@ -43,10 +43,10 @@ export const OrganizationTeamInviteForm = (props) => { const fetchGroups = useCallback(async () => { try { setLoadingGroups(true); - const response = await client.query(listCognitoGroups({ filter })); + const response = await client.query(listGroups({ filter })); if (!response.errors) { setGroupOptions( - response.data.listCognitoGroups.map((g) => ({ + response.data.listGroups.map((g) => ({ ...g, value: g.groupName, label: g.groupName diff --git a/frontend/src/reauthentication/components/ReAuthModal.js b/frontend/src/reauthentication/components/ReAuthModal.js index 60352054c..e93e45c0e 100644 --- a/frontend/src/reauthentication/components/ReAuthModal.js +++ b/frontend/src/reauthentication/components/ReAuthModal.js @@ -25,7 +25,14 @@ export const ReAuthModal = () => { const timestamp = new Date(); const pathname = location.pathname; const username = user.name; - storeRequestInfo({ requestInfo, timestamp, pathname, username }); + const id_token = user.id_token; + storeRequestInfo({ + requestInfo, + timestamp, + pathname, + username, + id_token + }); } }, [reAuthStatus, requestInfo]); diff --git a/frontend/src/reauthentication/contexts/RequestContext.js b/frontend/src/reauthentication/contexts/RequestContext.js index 5aedd1bfd..fce9f44a4 100644 --- a/frontend/src/reauthentication/contexts/RequestContext.js +++ b/frontend/src/reauthentication/contexts/RequestContext.js @@ -6,6 +6,7 @@ import { print } from 'graphql/language'; import { useNavigate } from 'react-router'; import { useSnackbar } from 'notistack'; import { Auth } from 'aws-amplify'; +import { useAuth, useToken } from '../../authentication'; // Create a context for API request headers const RequestContext = createContext(); @@ -52,6 +53,8 @@ export const RequestContextProvider = (props) => { const [requestInfo, setRequestInfo] = useState(null); const navigate = useNavigate(); const client = useClient(); + const token = useToken(); + const auth = useAuth(); const { enqueueSnackbar } = useSnackbar(); const storeRequestInfo = (info) => { setRequestInfo(info); @@ -67,7 +70,11 @@ export const RequestContextProvider = (props) => { if (client) { const restoredRequestInfo = restoreRetryRequest(); // If request info is restored from previous user session - if (restoredRequestInfo && restoredRequestInfo.timestamp) { + if ( + restoredRequestInfo && + restoredRequestInfo.timestamp && + token !== restoredRequestInfo.id_token + ) { const currentTime = new Date(); const reauthTime = new Date( restoredRequestInfo.timestamp.replace(/\s/g, '') @@ -127,8 +134,9 @@ export const RequestContextProvider = (props) => { const retryRequest = async (restoredInfo) => { const gqlTemplateLiteral = gql(print(restoredInfo.requestInfo.query)); - const username = await retrieveCurrentUsername(); - console.error(username); + const username = process.env.REACT_APP_CUSTOM_AUTH + ? auth.user.email + : await retrieveCurrentUsername(); if (username !== restoredInfo.username) { return null; } else if ( diff --git a/frontend/src/services/graphql/Groups/index.js b/frontend/src/services/graphql/Groups/index.js index e99b1948f..07e00aa43 100644 --- a/frontend/src/services/graphql/Groups/index.js +++ b/frontend/src/services/graphql/Groups/index.js @@ -1 +1 @@ -export * from './listCognitoGroups'; +export * from './listGroups'; diff --git a/frontend/src/services/graphql/Groups/listGroups.js b/frontend/src/services/graphql/Groups/listGroups.js new file mode 100644 index 000000000..3e72399d8 --- /dev/null +++ b/frontend/src/services/graphql/Groups/listGroups.js @@ -0,0 +1,14 @@ +import { gql } from 'apollo-boost'; + +export const listGroups = ({ filter }) => ({ + variables: { + filter + }, + query: gql` + query listGroups($filter: ServiceProviderGroupFilter) { + listGroups(filter: $filter) { + groupName + } + } + ` +}); diff --git a/frontend/src/services/hooks/useGroups.js b/frontend/src/services/hooks/useGroups.js index 9cf291e52..ef330f2fb 100644 --- a/frontend/src/services/hooks/useGroups.js +++ b/frontend/src/services/hooks/useGroups.js @@ -1,16 +1,44 @@ import { Auth } from 'aws-amplify'; import { useEffect, useState } from 'react'; import { SET_ERROR, useDispatch } from 'globalErrors'; +import { useClient } from './useClient'; +import { useAuth } from '../../authentication'; +import { getGroupsForUser } from '../../authentication/services/getServiceProviderInfo'; export const useGroups = () => { const dispatch = useDispatch(); const [groups, setGroups] = useState(null); + const client = useClient(); + const auth = useAuth(); const fetchGroups = async () => { if ( !process.env.REACT_APP_COGNITO_USER_POOL_ID && process.env.REACT_APP_GRAPHQL_API.includes('localhost') ) { - setGroups(['Engineers', 'Scientists']); + setGroups(['Engineers', 'Scientists', 'DAAdministrators']); + } else if (process.env.REACT_APP_CUSTOM_AUTH) { + if (window.localStorage.getItem('user_groups') != null) { + setGroups(window.localStorage.getItem('user_groups').split(',')); + return; + } + if (!auth.user) { + dispatch({ + type: SET_ERROR, + error: 'Cannot Set User Groups as the User is not defined' + }); + } + // return if the client is null, and then trigger this when the client is present + if (client == null) return; + const response = await client.query(getGroupsForUser(auth.user.short_id)); + if (!response.error) { + setGroups(response.data.getGroupsForUser); + window.localStorage.setItem( + 'user_groups', + response.data.getGroupsForUser.join(',') + ); + } else { + dispatch({ type: SET_ERROR, error: response.error }); + } } else { const session = await Auth.currentSession(); const cognitoGroups = session.getIdToken().payload['cognito:groups']; diff --git a/template_cdk.json b/template_cdk.json index f38434f4c..c8f4904c9 100644 --- a/template_cdk.json +++ b/template_cdk.json @@ -45,7 +45,19 @@ "reauth_apis": "list_of_strings_OPERATION_NAMES_TO_REQUIRE_REAUTH_ON|DEFAULT=None", "ttl": "int_TIME_IN_MINUTES_TO_ALLOW_USER_TO_PERFORM_SENSITIVE_APIS_BEFORE_FORCING_REAUTH|DEFAULT=5" }, - "cognito_user_session_timeout_inmins": "integer_COGNITO_USER_SESSION_TIMEOUT_INMINS|DEFAULT=43200" + "cognito_user_session_timeout_inmins": "integer_COGNITO_USER_SESSION_TIMEOUT_INMINS|DEFAULT=43200", + "custom_auth": { + "provider": "string_EXTERNAL_IDP_PROVIDER_NAME|DEFAULT=None", + "url" : "string_HTTPS_ISSUER_URL_OF_THE_EXTERNAL_IDP|DEFAULT=None", + "client_id": "string_EXTERNAL_IDP_CLIENT_ID|DEFAULT=None", + "response_types": "string_EXTERNAL_RESPONSE_TYPES_USED_IN_OIDC_FLOW|DEFAULT=None", + "scopes": "string_EXTERNAL_IDP_SCOPES_SPACE_SEPARATED|DEFAULT=None", + "jwks_url" : "string_EXTERNAL_IDP_JWKS_URL|DEFAULT=None", + "claims_mapping": { + "user_id": "string_USER_ID_CLAIM_NAME_MAPPING_FOR_EXTERNAL_IDP|DEFAULT=None", + "email": "string_EMAIL_ID_CLAIM_NAME_MAPPING_FOR_EXTERNAL_IDP|DEFAULT=None" + } + } } ] } diff --git a/tests/conftest.py b/tests/conftest.py index c803c3350..b895e2cc6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,7 +6,7 @@ from dataall.base.loader import load_modules, ImportMode, list_loaded_modules from glob import glob -from dataall.core.cognito_groups.db.cognito_group_models import Group +from dataall.core.groups.db.group_models import Group from dataall.core.permissions.db import Tenant, Permission from dataall.core.permissions.db.tenant_policy_repositories import TenantPolicy from dataall.core.permissions.permissions import TENANT_ALL diff --git a/tests/core/cognito_groups/test_group.py b/tests/core/cognito_groups/test_group.py deleted file mode 100644 index 9eb8ec26e..000000000 --- a/tests/core/cognito_groups/test_group.py +++ /dev/null @@ -1,25 +0,0 @@ - - -def test_list_cognito_groups_env(client, env_fixture, group, module_mocker): - module_mocker.patch( - 'dataall.base.aws.cognito.Cognito.list_cognito_groups', - return_value=[{"GroupName": 'cognitos'}, {"GroupName": 'testadmins'}], - ) - response = client.query( - """ - query listCognitoGroups ( - $filter: CognitoGroupFilter - ) { - listCognitoGroups ( - filter: $filter - ){ - groupName - } - } - """, - username='alice', - filter={'type': 'environment', 'uri': env_fixture.environmentUri}, - ) - assert response.data.listCognitoGroups[0].groupName == 'cognitos' - - diff --git a/tests/core/groups/__init__.py b/tests/core/groups/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/core/groups/test_group.py b/tests/core/groups/test_group.py new file mode 100644 index 000000000..aa638d4fc --- /dev/null +++ b/tests/core/groups/test_group.py @@ -0,0 +1,32 @@ +from unittest.mock import MagicMock + + +def test_list_groups_env(client, env_fixture, group, module_mocker): + mock_client = MagicMock() + module_mocker.patch( + 'dataall.base.aws.cognito.Cognito', + return_value=mock_client + ) + mock_client().list_groups.return_value = [{"GroupName": 'cognitos'}, {"GroupName": 'testadmins'}] + module_mocker.patch( + 'dataall.core.groups.api.resolvers.ServiceProviderFactory.get_service_provider_instance', + return_value=mock_client() + ) + response = client.query( + """ + query listGroups ( + $filter: ServiceProviderGroupFilter + ) { + listGroups ( + filter: $filter + ){ + groupName + } + } + """, + username='alice', + filter={'type': 'environment', 'uri': env_fixture.environmentUri}, + ) + assert response.data.listGroups[0].groupName == 'cognitos' + + diff --git a/tests/modules/datasets/tasks/test_lf_share_manager.py b/tests/modules/datasets/tasks/test_lf_share_manager.py index fd76ba0b1..c0d8b222d 100644 --- a/tests/modules/datasets/tasks/test_lf_share_manager.py +++ b/tests/modules/datasets/tasks/test_lf_share_manager.py @@ -10,7 +10,7 @@ from typing import Callable -from dataall.core.cognito_groups.db.cognito_group_models import Group +from dataall.core.groups.db.group_models import Group from dataall.core.organizations.db.organization_models import Organization from dataall.core.environment.db.environment_models import Environment, EnvironmentGroup from dataall.modules.dataset_sharing.api.enums import ShareItemStatus diff --git a/tests/modules/datasets/tasks/test_s3_access_point_share_manager.py b/tests/modules/datasets/tasks/test_s3_access_point_share_manager.py index 90bb932fa..edd733196 100644 --- a/tests/modules/datasets/tasks/test_s3_access_point_share_manager.py +++ b/tests/modules/datasets/tasks/test_s3_access_point_share_manager.py @@ -5,7 +5,7 @@ from typing import Callable -from dataall.core.cognito_groups.db.cognito_group_models import Group +from dataall.core.groups.db.group_models import Group from dataall.core.environment.db.environment_models import Environment, EnvironmentGroup from dataall.core.organizations.db.organization_models import Organization from dataall.modules.dataset_sharing.aws.s3_client import S3ControlClient diff --git a/tests/modules/datasets/tasks/test_s3_bucket_share_manager.py b/tests/modules/datasets/tasks/test_s3_bucket_share_manager.py index 39a3edb51..5159c3f64 100644 --- a/tests/modules/datasets/tasks/test_s3_bucket_share_manager.py +++ b/tests/modules/datasets/tasks/test_s3_bucket_share_manager.py @@ -4,7 +4,7 @@ from typing import Callable -from dataall.core.cognito_groups.db.cognito_group_models import Group +from dataall.core.groups.db.group_models import Group from dataall.core.environment.db.environment_models import Environment, EnvironmentGroup from dataall.core.organizations.db.organization_models import Organization from dataall.modules.dataset_sharing.db.share_object_models import ShareObject diff --git a/tests/modules/notifications/test_notification_service.py b/tests/modules/notifications/test_notification_service.py index 30b1f7c6c..c390a8fe6 100644 --- a/tests/modules/notifications/test_notification_service.py +++ b/tests/modules/notifications/test_notification_service.py @@ -35,7 +35,13 @@ def test_notification_service_email( # Mock Cognito Client cognito_client = mock_cognito_client(mocker) - cognito_client().get_user_emailids_from_group.return_value = ["requester@email.com", "dataset_owner@email.com", "dataset_steward@email.com"] + cognito_client().get_user_emailids_from_group.return_value = ["bob@email.com", "bob-1@email.com"] + + # Mock the ServiceProviderFactory Call + mocker.patch( + 'dataall.modules.notifications.services.ses_email_notification_service.ServiceProviderFactory.get_service_provider_instance', + return_value=cognito_client() + ) # Create an email task with db.scoped_session() as session: @@ -60,8 +66,8 @@ def test_notification_service_email( group_name_list_used_for_share = [x.args[0] for x in cognito_calls] assert 'datasetOwnerGroup' in group_name_list_used_for_share and 'datasetStewardsGroup' in group_name_list_used_for_share and 'requesterGroupName' in group_name_list_used_for_share mock_ses_client().send_email.assert_called() - # Check if the email notification was called for 4 times 'recipientGroupsList' + 'recipientEmailList' - assert mock_ses_client().send_email.call_count == 4 + # Check if the email send method is called three times for ["bob@email.com", "bob-1@email.com", "email@email.com"] + assert mock_ses_client().send_email.call_count == 3 # Test to check when unknown notification type is used # Added function to check the if-else logic in notification handler @@ -108,6 +114,12 @@ def test_notification_service_with_no_email_ids_in_group( cognito_client = mock_cognito_client(mocker) cognito_client().get_user_emailids_from_group.return_value = [] + # Mock the ServiceProviderFactory Call + mocker.patch( + 'dataall.modules.notifications.services.ses_email_notification_service.ServiceProviderFactory.get_service_provider_instance', + return_value=cognito_client() + ) + with db.scoped_session() as session: notification_task: Task = Task( action='notification.service', @@ -140,6 +152,12 @@ def test_notification_service_with_sender_email_id_is_none( cognito_client = mock_cognito_client(mocker) cognito_client().get_user_emailids_from_group.return_value = ['bob@email.com'] + # Mock the ServiceProviderFactory Call + mocker.patch( + 'dataall.modules.notifications.services.ses_email_notification_service.ServiceProviderFactory.get_service_provider_instance', + return_value=cognito_client() + ) + with db.scoped_session() as session: notification_task: Task = Task( action='notification.service', From f173c2ab748dbc7ecc0459fff047369f4d634798 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 1 Dec 2023 11:36:58 -0600 Subject: [PATCH 02/17] Backend and Frontend Changes For External Idp Changes - 2 --- backend/api_handler.py | 3 ++- frontend/src/authentication/contexts/OidcAuthContext.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/api_handler.py b/backend/api_handler.py index c48d69bd1..031fb6a9c 100644 --- a/backend/api_handler.py +++ b/backend/api_handler.py @@ -133,7 +133,8 @@ def handler(event, context): try: groups = get_groups(claims) if (os.environ.get('custom_auth', None)): - groups.extend(get_custom_groups(event)) + user_id = event['requestContext']['authorizer']['user_id'] + groups.extend(get_custom_groups(user_id)) log.debug('groups are %s', ",".join(groups)) with ENGINE.scoped_session() as session: for group in groups: diff --git a/frontend/src/authentication/contexts/OidcAuthContext.js b/frontend/src/authentication/contexts/OidcAuthContext.js index 9f90e67c3..aeacb93c8 100644 --- a/frontend/src/authentication/contexts/OidcAuthContext.js +++ b/frontend/src/authentication/contexts/OidcAuthContext.js @@ -1,4 +1,4 @@ -import { AuthProvider, useAuth } from 'react-oidc-context'; +import { AuthProvider } from 'react-oidc-context'; import PropTypes from 'prop-types'; import { WebStorageStateStore } from 'oidc-client-ts'; import { GenericAuthProvider } from './GenericAuthContext'; From 0f4b88ececec2dcd33eb6b973e5d9373c24db260 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 1 Dec 2023 11:58:11 -0600 Subject: [PATCH 03/17] semgrep and linting corrections --- backend/dataall/base/aws/cognito.py | 1 - backend/dataall/base/services/service_provider_factory.py | 2 +- backend/dataall/core/groups/api/queries.py | 1 - backend/dataall/core/groups/api/resolvers.py | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/dataall/base/aws/cognito.py b/backend/dataall/base/aws/cognito.py index b7277fdf8..57bd9b98f 100644 --- a/backend/dataall/base/aws/cognito.py +++ b/backend/dataall/base/aws/cognito.py @@ -54,4 +54,3 @@ def list_groups(self, envname: str, region: str): def get_groups_for_user(self, user_id): return [] - diff --git a/backend/dataall/base/services/service_provider_factory.py b/backend/dataall/base/services/service_provider_factory.py index ada00c1e2..040f1ec52 100644 --- a/backend/dataall/base/services/service_provider_factory.py +++ b/backend/dataall/base/services/service_provider_factory.py @@ -12,4 +12,4 @@ def get_service_provider_instance(): # Please take a look at the "Deploy to AWS" , External IDP section for steps return None else: - return Cognito() \ No newline at end of file + return Cognito() diff --git a/backend/dataall/core/groups/api/queries.py b/backend/dataall/core/groups/api/queries.py index 810e6d5fe..bd5338932 100644 --- a/backend/dataall/core/groups/api/queries.py +++ b/backend/dataall/core/groups/api/queries.py @@ -24,4 +24,3 @@ type=gql.ArrayType(gql.String), resolver=get_groups_for_user, ) - diff --git a/backend/dataall/core/groups/api/resolvers.py b/backend/dataall/core/groups/api/resolvers.py index e8c34ae80..01e44beeb 100644 --- a/backend/dataall/core/groups/api/resolvers.py +++ b/backend/dataall/core/groups/api/resolvers.py @@ -82,4 +82,3 @@ def get_groups_for_user(context, source, userid): service_provider = ServiceProviderFactory.get_service_provider_instance() groups = service_provider.get_groups_for_user(userid) return groups - From e844dae365a05cf467f98599ce375f28cb0590d5 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 1 Dec 2023 12:02:58 -0600 Subject: [PATCH 04/17] npm audit corrections --- frontend/package-lock.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ec16633ef..e83850ac3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25849,6 +25849,18 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/react-oidc-context": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-oidc-context/-/react-oidc-context-2.3.1.tgz", + "integrity": "sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "oidc-client-ts": "^2.2.1", + "react": ">=16.8.0" + } + }, "node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", @@ -41757,6 +41769,11 @@ "which": "^1.2.9" } }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", From e39f7ab780135d33f07938016b99d379edf934fa Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 1 Dec 2023 12:17:05 -0600 Subject: [PATCH 05/17] npm audit corrections - 1 --- frontend/package-lock.json | 17 + frontend/yarn.lock | 2975 +++++++++++++++++++++++++++++------- 2 files changed, 2450 insertions(+), 542 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e83850ac3..b3c46ca3f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15363,6 +15363,11 @@ "node": ">=4.8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -23646,6 +23651,18 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, + "node_modules/oidc-client-ts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", + "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", + "dependencies": { + "crypto-js": "^4.2.0", + "jwt-decode": "^3.1.2" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index f5790e41a..6d048696f 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -7,9 +7,9 @@ resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@adobe/css-tools@^4.0.1": +"@adobe/css-tools@4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz" integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== "@alloc/quick-lru@^5.2.0": @@ -293,15 +293,6 @@ fast-xml-parser "^4.2.5" tslib "^1.8.0" -"@aws-crypto/crc32@2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz" - integrity sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA== - dependencies: - "@aws-crypto/util" "^2.0.0" - "@aws-sdk/types" "^3.1.0" - tslib "^1.11.1" - "@aws-crypto/crc32@^1.0.0": version "1.2.2" resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.2.2.tgz" @@ -311,6 +302,15 @@ "@aws-sdk/types" "^3.1.0" tslib "^1.11.1" +"@aws-crypto/crc32@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz" + integrity sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA== + dependencies: + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + "@aws-crypto/ie11-detection@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz" @@ -325,6 +325,19 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/sha256-browser@^1.0.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.2.2.tgz" + integrity sha512-0tNR4kBtJp+9S0kis4+JLab3eg6QWuIeuPhzaYoYwNUXGBgsWIkktA2mnilet+EGWzf3n1zknJXC4X4DVyyXbg== + dependencies: + "@aws-crypto/ie11-detection" "^1.0.0" + "@aws-crypto/sha256-js" "^1.2.2" + "@aws-crypto/supports-web-crypto" "^1.0.0" + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-locate-window" "^3.0.0" + tslib "^1.11.1" + "@aws-crypto/sha256-browser@2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz" @@ -339,20 +352,7 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-crypto/sha256-browser@^1.0.0": - version "1.2.2" - resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.2.2.tgz" - integrity sha512-0tNR4kBtJp+9S0kis4+JLab3eg6QWuIeuPhzaYoYwNUXGBgsWIkktA2mnilet+EGWzf3n1zknJXC4X4DVyyXbg== - dependencies: - "@aws-crypto/ie11-detection" "^1.0.0" - "@aws-crypto/sha256-js" "^1.2.2" - "@aws-crypto/supports-web-crypto" "^1.0.0" - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" - "@aws-sdk/util-locate-window" "^3.0.0" - tslib "^1.11.1" - -"@aws-crypto/sha256-js@1.2.2", "@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.2.2": +"@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.2.2", "@aws-crypto/sha256-js@1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz" integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== @@ -361,7 +361,7 @@ "@aws-sdk/types" "^3.1.0" tslib "^1.11.1" -"@aws-crypto/sha256-js@2.0.0", "@aws-crypto/sha256-js@^2.0.0": +"@aws-crypto/sha256-js@^2.0.0", "@aws-crypto/sha256-js@2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz" integrity sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig== @@ -1645,12 +1645,7 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/types@3.186.0": - version "3.186.0" - resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.186.0.tgz" - integrity sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ== - -"@aws-sdk/types@3.6.1", "@aws-sdk/types@^3.1.0": +"@aws-sdk/types@^3.1.0", "@aws-sdk/types@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.6.1.tgz" integrity sha512-4Dx3eRTrUHLxhFdLJL8zdNGzVsJfAxtxPYYGmIddUkO2Gj3WA1TGjdfG4XN/ClI6e1XonCHafQX3UYO/mgnH3g== @@ -1662,6 +1657,11 @@ dependencies: tslib "^2.5.0" +"@aws-sdk/types@3.186.0": + version "3.186.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.186.0.tgz" + integrity sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ== + "@aws-sdk/url-parser-native@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/url-parser-native/-/url-parser-native-3.6.1.tgz" @@ -1871,6 +1871,13 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" +"@aws-sdk/util-utf8-browser@^3.0.0", "@aws-sdk/util-utf8-browser@3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.6.1.tgz" + integrity sha512-gZPySY6JU5gswnw3nGOEHl3tYE7vPKvtXGYoS2NRabfDKRejFvu+4/nNW6SSpoOxk6LSXsrWB39NO51k+G4PVA== + dependencies: + tslib "^1.8.0" + "@aws-sdk/util-utf8-browser@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.186.0.tgz" @@ -1878,13 +1885,6 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@3.6.1", "@aws-sdk/util-utf8-browser@^3.0.0": - version "3.6.1" - resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.6.1.tgz" - integrity sha512-gZPySY6JU5gswnw3nGOEHl3tYE7vPKvtXGYoS2NRabfDKRejFvu+4/nNW6SSpoOxk6LSXsrWB39NO51k+G4PVA== - dependencies: - tslib "^1.8.0" - "@aws-sdk/util-utf8-node@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.186.0.tgz" @@ -1910,27 +1910,20 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz" integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.16.0", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@>=7.11.0": version "7.22.8" resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz" integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== @@ -1960,19 +1953,9 @@ "@nicolo-ribaudo/semver-v6" "^6.3.3" eslint-visitor-keys "^2.1.0" -"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.23.0": +"@babel/generator@^7.20.0", "@babel/generator@^7.22.7", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz" integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: "@babel/types" "^7.23.0" @@ -1994,7 +1977,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz" integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== @@ -2040,27 +2023,14 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -2113,7 +2083,7 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz" integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== @@ -2161,17 +2131,12 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.22.5": version "7.22.15" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== @@ -2197,30 +2162,16 @@ "@babel/highlight@^7.22.13": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": @@ -2239,7 +2190,17 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-proposal-class-properties@^7.16.0": +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -2258,7 +2219,15 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.5" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.22.17" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.17.tgz" + integrity sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.22.5" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -2266,7 +2235,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0": +"@babel/plugin-proposal-numeric-separator@^7.0.0", "@babel/plugin-proposal-numeric-separator@^7.16.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -2274,7 +2243,26 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-optional-chaining@^7.16.0": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.20.0": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -2318,7 +2306,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -2339,13 +2327,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz" + integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" @@ -2353,7 +2348,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.22.5": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== @@ -2388,7 +2383,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== @@ -2402,7 +2397,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -2416,7 +2411,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -2430,7 +2425,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -2466,7 +2461,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.22.5": +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== @@ -2483,7 +2478,7 @@ "@babel/helper-remap-async-to-generator" "^7.22.5" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.22.5": +"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== @@ -2492,14 +2487,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.5": +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== @@ -2523,7 +2518,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.6": +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== @@ -2538,7 +2533,7 @@ "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.22.5": +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== @@ -2546,7 +2541,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.5": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== @@ -2592,7 +2587,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.16.0": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== @@ -2600,14 +2595,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-flow" "^7.22.5" -"@babel/plugin-transform-for-of@^7.22.5": +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.22.5": +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== @@ -2624,7 +2619,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.22.5": +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== @@ -2639,7 +2634,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.22.5": +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== @@ -2654,7 +2649,7 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.22.5": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== @@ -2681,7 +2676,7 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== @@ -2723,7 +2718,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.22.5" -"@babel/plugin-transform-object-super@^7.22.5": +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== @@ -2748,7 +2743,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.5": +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== @@ -2773,7 +2768,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.22.5": +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== @@ -2787,7 +2782,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== @@ -2801,7 +2796,21 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz" + integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz" + integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== @@ -2835,7 +2844,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@^7.16.4": +"@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.16.4": version "7.22.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz" integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== @@ -2847,14 +2856,14 @@ babel-plugin-polyfill-corejs3 "^0.8.2" babel-plugin-polyfill-regenerator "^0.5.1" -"@babel/plugin-transform-shorthand-properties@^7.22.5": +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.22.5": +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== @@ -2862,14 +2871,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.22.5": +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.22.5": +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== @@ -2883,7 +2892,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.22.5": +"@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz" integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== @@ -2908,7 +2917,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.22.5": +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== @@ -2924,7 +2933,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": version "7.22.7" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.7.tgz" integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== @@ -3010,6 +3019,15 @@ babel-plugin-polyfill-regenerator "^0.5.1" core-js-compat "^3.31.0" +"@babel/preset-flow@^7.13.13": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz" + integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" @@ -3033,7 +3051,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.22.5" "@babel/plugin-transform-react-pure-annotations" "^7.22.5" -"@babel/preset-typescript@^7.16.0": +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== @@ -3044,39 +3062,41 @@ "@babel/plugin-transform-modules-commonjs" "^7.22.5" "@babel/plugin-transform-typescript" "^7.22.5" +"@babel/register@^7.13.16": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz" + integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.22.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.22.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.22.10" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz" integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15": +"@babel/template@^7.0.0", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: "@babel/code-frame" "^7.22.13" "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": +"@babel/traverse@7.23.2": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" @@ -3090,18 +3110,9 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.23.0": +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" @@ -3295,7 +3306,7 @@ "@emotion/weak-memoize" "^0.3.1" stylis "4.2.0" -"@emotion/core@^10.0.28": +"@emotion/core@^10.0.27", "@emotion/core@^10.0.28": version "10.3.1" resolved "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz" integrity sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww== @@ -3316,22 +3327,15 @@ "@emotion/utils" "0.11.3" babel-plugin-emotion "^10.0.27" -"@emotion/hash@0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - "@emotion/hash@^0.9.1": version "0.9.1" resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@0.8.8": - version "0.8.8" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" +"@emotion/hash@0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== "@emotion/is-prop-valid@^1.2.1": version "1.2.1" @@ -3340,17 +3344,24 @@ dependencies: "@emotion/memoize" "^0.8.1" -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@emotion/is-prop-valid@0.8.8": + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== -"@emotion/react@^11.8.2": +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.8.2", "@emotion/react@^11.9.0": version "11.11.1" resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== @@ -3386,16 +3397,16 @@ "@emotion/utils" "^1.2.1" csstype "^3.0.2" -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - "@emotion/sheet@^1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== +"@emotion/sheet@0.9.4": + version "0.9.4" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz" + integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== + "@emotion/styled-base@^10.3.0": version "10.3.0" resolved "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz" @@ -3414,7 +3425,7 @@ "@emotion/styled-base" "^10.3.0" babel-plugin-emotion "^10.0.27" -"@emotion/styled@^11.8.1": +"@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": version "11.11.0" resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== @@ -3431,41 +3442,41 @@ resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== -"@emotion/unitless@0.7.5": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - "@emotion/unitless@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== +"@emotion/unitless@0.7.5": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@emotion/use-insertion-effect-with-fallbacks@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== - "@emotion/utils@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -"@emotion/weak-memoize@0.2.5": - version "0.2.5" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@emotion/utils@0.11.3": + version "0.11.3" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz" + integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== "@emotion/weak-memoize@^0.3.1": version "0.3.1" resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@emotion/weak-memoize@0.2.5": + version "0.2.5" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -3503,6 +3514,18 @@ resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.11": version "0.11.11" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" @@ -3596,6 +3619,13 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/create-cache-key-function@^29.2.1": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + "@jest/environment@^27.5.1": version "27.5.1" resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" @@ -3606,6 +3636,16 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + "@jest/expect-utils@^29.6.1": version "29.6.1" resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz" @@ -3625,6 +3665,18 @@ jest-mock "^27.5.1" jest-util "^27.5.1" +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + "@jest/globals@^27.5.1": version "27.5.1" resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" @@ -3672,7 +3724,7 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.6.0": +"@jest/schemas@^29.6.0", "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== @@ -3739,6 +3791,17 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@jest/types@^27.5.1": version "27.5.1" resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" @@ -3774,6 +3837,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" @@ -3801,7 +3876,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -3878,7 +3953,7 @@ prop-types "^15.8.1" react-is "^18.2.0" -"@mui/material@^5.5.2": +"@mui/material@^5.0.0", "@mui/material@^5.4.1", "@mui/material@^5.5.2": version "5.13.7" resolved "https://registry.npmjs.org/@mui/material/-/material-5.13.7.tgz" integrity sha512-+n453jDDm88zZM3b5YK29nZ7gXY+s+rryH9ovDbhmfSkOlFtp+KSqbXy5cTaC/UlDqDM7sYYJGq8BmJov3v9Tg== @@ -3938,7 +4013,7 @@ jss-plugin-vendor-prefixer "^10.10.0" prop-types "^15.8.1" -"@mui/system@^5.13.7": +"@mui/system@^5.13.7", "@mui/system@^5.4.1": version "5.14.8" resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.8.tgz" integrity sha512-Dxnasv7Pj5hYe4ZZFKJZu4ufKm6cxpitWt3A+qMPps22YhqyeEqgDBq/HsAB3GOjqDP40fTAvQvS/Hguf4SJuw== @@ -4017,7 +4092,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -4050,30 +4125,232 @@ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@reduxjs/toolkit@^1.8.0": - version "1.9.5" - resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz" - integrity sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ== +"@react-native-community/cli-clean@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.6.tgz" + integrity sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g== dependencies: - immer "^9.0.21" - redux "^4.2.1" - redux-thunk "^2.4.2" - reselect "^4.1.8" + "@react-native-community/cli-tools" "11.3.6" + chalk "^4.1.2" + execa "^5.0.0" + prompts "^2.4.0" -"@rollup/plugin-babel@^5.2.0": - version "5.3.1" - resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" - integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== +"@react-native-community/cli-config@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.6.tgz" + integrity sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" + "@react-native-community/cli-tools" "11.3.6" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^4.3.0" + glob "^7.1.3" + joi "^17.2.1" -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== +"@react-native-community/cli-debugger-ui@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.6.tgz" + integrity sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w== dependencies: - "@rollup/pluginutils" "^3.1.0" + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.6.tgz" + integrity sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA== + dependencies: + "@react-native-community/cli-config" "11.3.6" + "@react-native-community/cli-platform-android" "11.3.6" + "@react-native-community/cli-platform-ios" "11.3.6" + "@react-native-community/cli-tools" "11.3.6" + 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 "^7.5.2" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + yaml "^2.2.1" + +"@react-native-community/cli-hermes@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.6.tgz" + integrity sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA== + dependencies: + "@react-native-community/cli-platform-android" "11.3.6" + "@react-native-community/cli-tools" "11.3.6" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.6.tgz" + integrity sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A== + dependencies: + "@react-native-community/cli-tools" "11.3.6" + chalk "^4.1.2" + execa "^5.0.0" + glob "^7.1.3" + logkitty "^0.7.1" + +"@react-native-community/cli-platform-ios@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.6.tgz" + integrity sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw== + dependencies: + "@react-native-community/cli-tools" "11.3.6" + chalk "^4.1.2" + execa "^5.0.0" + fast-xml-parser "^4.0.12" + glob "^7.1.3" + ora "^5.4.1" + +"@react-native-community/cli-plugin-metro@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.6.tgz" + integrity sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g== + dependencies: + "@react-native-community/cli-server-api" "11.3.6" + "@react-native-community/cli-tools" "11.3.6" + 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" + readline "^1.3.0" + +"@react-native-community/cli-server-api@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.6.tgz" + integrity sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg== + dependencies: + "@react-native-community/cli-debugger-ui" "11.3.6" + "@react-native-community/cli-tools" "11.3.6" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.6.tgz" + integrity sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^7.5.2" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.6.tgz" + integrity sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@11.3.6": + version "11.3.6" + resolved "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.6.tgz" + integrity sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww== + dependencies: + "@react-native-community/cli-clean" "11.3.6" + "@react-native-community/cli-config" "11.3.6" + "@react-native-community/cli-debugger-ui" "11.3.6" + "@react-native-community/cli-doctor" "11.3.6" + "@react-native-community/cli-hermes" "11.3.6" + "@react-native-community/cli-plugin-metro" "11.3.6" + "@react-native-community/cli-server-api" "11.3.6" + "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-types" "11.3.6" + 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/assets-registry@^0.72.0": + version "0.72.0" + resolved "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz" + integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== + +"@react-native/codegen@^0.72.6": + version "0.72.7" + resolved "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.72.7.tgz" + integrity sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg== + dependencies: + "@babel/parser" "^7.20.0" + flow-parser "^0.206.0" + jscodeshift "^0.14.0" + nullthrows "^1.1.1" + +"@react-native/gradle-plugin@^0.72.11": + version "0.72.11" + resolved "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz" + integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw== + +"@react-native/js-polyfills@^0.72.1": + version "0.72.1" + resolved "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz" + integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA== + +"@react-native/normalize-colors@*", "@react-native/normalize-colors@^0.72.0": + version "0.72.0" + resolved "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz" + integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== + +"@react-native/virtualized-lists@^0.72.8": + version "0.72.8" + resolved "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz" + integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + +"@reduxjs/toolkit@^1.8.0": + version "1.9.5" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz" + integrity sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" builtin-modules "^3.1.0" deepmerge "^4.2.2" @@ -4102,6 +4379,23 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz" integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" @@ -4119,6 +4413,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers@^8.0.1": version "8.1.0" resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" @@ -4253,6 +4561,20 @@ lz-string "^1.5.0" pretty-format "^27.0.2" +"@testing-library/dom@>=7.21.4": + version "9.3.1" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz" + integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + "@testing-library/jest-dom@^5.16.2": version "5.16.5" resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz" @@ -4319,7 +4641,7 @@ resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.9": version "7.20.1" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== @@ -4586,7 +4908,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17": +"@types/react@*", "@types/react@^17", "@types/react@^17.0.0 || ^18.0.0": version "17.0.62" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz" integrity sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw== @@ -4677,6 +4999,13 @@ resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^16.0.0": version "16.0.5" resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" @@ -4696,7 +5025,7 @@ resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz" integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== -"@typescript-eslint/eslint-plugin@^5.5.0": +"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0": version "5.61.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz" integrity sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g== @@ -4719,7 +5048,7 @@ dependencies: "@typescript-eslint/utils" "5.61.0" -"@typescript-eslint/parser@^5.5.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0": version "5.61.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz" integrity sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg== @@ -4765,7 +5094,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.61.0", "@typescript-eslint/utils@^5.58.0": +"@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@5.61.0": version "5.61.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz" integrity sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ== @@ -4787,7 +5116,7 @@ "@typescript-eslint/types" "5.61.0" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -4888,7 +5217,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -4966,7 +5295,14 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -4997,16 +5333,16 @@ acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - address@^1.0.1, address@^1.1.2: version "1.2.2" resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" @@ -5046,7 +5382,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5056,7 +5392,27 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0, ajv@>=8: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -5082,6 +5438,11 @@ amazon-quicksight-embedding-sdk@^1.18.1: resolved "https://registry.npmjs.org/amazon-quicksight-embedding-sdk/-/amazon-quicksight-embedding-sdk-1.20.1.tgz" integrity sha512-JYBCeq1Rq1OOeZQB9ry85uASTTtqZzp5hFv0ihIX7XyD9anvcoW6GHo4ttzdkJMTMMAnzXhIBe9CRKm3tHMzeg== +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -5089,12 +5450,26 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: dependencies: type-fest "^0.21.3" +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^5.0.1: +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -5104,6 +5479,13 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -5136,7 +5518,7 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apexcharts@^3.33.2: +apexcharts@^3.18.0, apexcharts@^3.33.2: version "3.41.0" resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz" integrity sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ== @@ -5174,7 +5556,7 @@ apollo-cache-inmemory@^1.6.6: ts-invariant "^0.4.0" tslib "^1.10.0" -apollo-cache@1.3.5, apollo-cache@^1.3.5: +apollo-cache@^1.3.5, apollo-cache@1.3.5: version "1.3.5" resolved "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz" integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA== @@ -5233,7 +5615,7 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.14: tslib "^1.9.3" zen-observable-ts "^0.8.21" -apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: +apollo-utilities@^1.3.0, apollo-utilities@^1.3.4, apollo-utilities@1.3.4: version "1.3.4" resolved "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz" integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== @@ -5252,6 +5634,11 @@ appbase-js@^5.2.0: querystring "^0.2.0" url-parser-lite "^0.1.0" +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" @@ -5269,7 +5656,7 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3, aria-query@^5.0.0, aria-query@^5.1.3: +aria-query@^5.0.0, aria-query@^5.1.3, aria-query@5.1.3: version "5.1.3" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== @@ -5284,16 +5671,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -5373,7 +5760,24 @@ ast-types-flow@^0.0.7: resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -async@^3.2.3: +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.2, async@^3.2.3: version "3.2.4" resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -5434,22 +5838,22 @@ axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== -axios@0.26.0: - version "0.26.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz" - integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== - dependencies: - follow-redirects "^1.14.8" - axios@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz" integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz" + integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== + dependencies: + follow-redirects "^1.14.8" + axobject-query@^3.1.1: version "3.2.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" @@ -5457,6 +5861,11 @@ axobject-query@^3.1.1: dependencies: dequal "^2.0.3" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" @@ -5570,6 +5979,18 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" @@ -5593,6 +6014,39 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.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.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-preset-jest@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" @@ -5633,7 +6087,7 @@ base-64@1.0.0: resolved "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz" integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -5663,6 +6117,15 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" @@ -5696,7 +6159,7 @@ bonjour-service@^1.0.11: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== @@ -5733,7 +6196,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4: version "4.21.9" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -5755,16 +6218,15 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +buffer@^5.4.3: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + base64-js "^1.3.1" + ieee754 "^1.1.13" -buffer@^5.4.3: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -5772,6 +6234,15 @@ buffer@^5.4.3: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" @@ -5795,6 +6266,25 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -5822,12 +6312,17 @@ camelcase-keys@6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0, camelcase@^6.2.1: +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^6.2.1: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -5857,9 +6352,18 @@ case-sensitive-paths-webpack-plugin@^2.4.0: resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -5917,6 +6421,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" @@ -5939,6 +6448,27 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -5948,6 +6478,29 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" @@ -5991,21 +6544,26 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colord@^2.9.1: version "2.9.3" resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + colorette@^2.0.10: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -6018,7 +6576,17 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0, commander@^2.20.3: +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^2.20.3: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6038,6 +6606,16 @@ commander@^8.3.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" @@ -6060,7 +6638,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: +compression@^1.7.1, compression@^1.7.4: version "1.7.4" resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -6088,6 +6666,16 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" @@ -6110,16 +6698,16 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - cookie@^0.4.0: version "0.4.2" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" @@ -6149,6 +6737,26 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@^5.0.5: + version "5.2.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" @@ -6196,7 +6804,25 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -6205,6 +6831,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" @@ -6286,15 +6917,15 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: - mdn-data "2.0.4" + mdn-data "2.0.14" source-map "^0.6.1" -css-tree@^1.1.2, css-tree@^1.1.3: +css-tree@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -6302,6 +6933,14 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + css-vendor@^2.0.8: version "2.0.8" resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" @@ -6418,7 +7057,12 @@ csstype@^2.5.7: resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== -csstype@^3.0.2, csstype@^3.1.2: +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -6437,31 +7081,31 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@^2.28.0: +date-fns@^2.0.0, date-fns@^2.25.0, date-fns@^2.28.0: version "2.30.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: "@babel/runtime" "^7.21.0" -dayjs@^1.11.0, dayjs@^1.11.7: +dayjs@^1.10.7, dayjs@^1.11.0, dayjs@^1.11.7, dayjs@^1.8.15, dayjs@^1.8.17: version "1.11.8" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz" integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== -debug@2.6.9, debug@^2.6.0: +debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "2.1.2" + ms "2.0.0" debug@^3.2.7: version "3.2.7" @@ -6470,6 +7114,25 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + decimal.js@^10.2.1: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -6519,6 +7182,11 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" @@ -6526,6 +7194,13 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" @@ -6544,16 +7219,30 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +deprecated-react-native-prop-types@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz" + integrity sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw== + dependencies: + "@react-native/normalize-colors" "*" + invariant "*" + prop-types "*" + dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" @@ -6655,14 +7344,6 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" @@ -6672,16 +7353,24 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -domelementtype@1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" @@ -6749,7 +7438,7 @@ echarts-for-react@^3.0.2: fast-deep-equal "^3.1.3" size-sensor "^1.0.1" -echarts@^5.3.3: +"echarts@^3.0.0 || ^4.0.0 || ^5.0.0", echarts@^5.3.3: version "5.4.2" resolved "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz" integrity sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA== @@ -6821,7 +7510,7 @@ enhanced-resolve@^5.15.0: graceful-fs "^4.2.4" tapable "^2.2.0" -entities@2.2.0, entities@^2.0.0: +entities@^2.0.0, entities@2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== @@ -6834,6 +7523,11 @@ env-cmd@^10.1.0: commander "^4.0.0" cross-spawn "^7.0.0" +envinfo@^7.7.2: + version "7.10.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -6848,6 +7542,14 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" +errorhandler@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: version "1.21.2" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" @@ -7029,7 +7731,7 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5, eslint-plugin-import@>=1.4.0: version "2.28.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz" integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== @@ -7121,7 +7823,7 @@ eslint-plugin-testing-library@^5.0.1: dependencies: "@typescript-eslint/utils" "^5.58.0" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -7137,6 +7839,14 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" @@ -7158,7 +7868,7 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.3.0: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, "eslint@>= 6", eslint@>=7.0.0, eslint@>=7.28.0: version "8.49.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz" integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== @@ -7210,7 +7920,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7254,6 +7964,11 @@ etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-target-shim@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -7386,6 +8101,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.0.12, fast-xml-parser@^4.2.5: + version "4.2.7" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz" + integrity sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig== + dependencies: + strnum "^1.0.5" + fast-xml-parser@4.2.5: version "4.2.5" resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz" @@ -7393,13 +8115,6 @@ fast-xml-parser@4.2.5: dependencies: strnum "^1.0.5" -fast-xml-parser@^4.2.5: - version "4.2.7" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz" - integrity sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig== - dependencies: - strnum "^1.0.5" - fastq@^1.6.0: version "1.15.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" @@ -7467,6 +8182,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + finalhandler@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" @@ -7480,6 +8208,15 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" @@ -7501,7 +8238,15 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -7530,10 +8275,20 @@ flatted@^3.1.0: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flow-enums-runtime@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz" + integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== + +flow-parser@^0.206.0, flow-parser@0.*: + version "0.206.0" + resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz" + integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== + follow-redirects@^1.0.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" @@ -7572,7 +8327,7 @@ form-data@^3.0.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -7616,7 +8371,26 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -7666,7 +8440,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -7704,7 +8478,7 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -7718,32 +8492,39 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -7801,7 +8582,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -7818,7 +8599,7 @@ graphql-tag@^2.12.6, graphql-tag@^2.4.2: dependencies: tslib "^2.1.0" -graphql@15.8.0: +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.3 || ^0.12.3 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: version "15.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== @@ -7891,6 +8672,25 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hermes-estree@0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.12.0.tgz" + integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw== + +hermes-parser@0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.12.0.tgz" + integrity sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw== + dependencies: + hermes-estree "0.12.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + history@^5.0.3: version "5.3.0" resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" @@ -7981,6 +8781,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -7992,16 +8802,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -8054,13 +8854,6 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -8068,21 +8861,28 @@ iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idb@5.0.6: - version "5.0.6" - resolved "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz" - integrity sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw== - idb@^7.0.1: version "7.1.1" resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== +idb@5.0.6: + version "5.0.6" + resolved "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz" + integrity sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw== + identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" @@ -8100,16 +8900,31 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -immer@9.0.6: - version "9.0.6" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz" - integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== +image-size@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + dependencies: + queue "6.0.2" immer@^9.0.21, immer@^9.0.7: version "9.0.21" resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== +immer@9.0.6: + version "9.0.6" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -8144,7 +8959,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8168,23 +8983,28 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -invariant@^2.2.4: +invariant@*, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ipaddr.js@^2.0.1: version "2.1.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -8248,6 +9068,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" @@ -8258,6 +9083,11 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" @@ -8280,6 +9110,11 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3: resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" @@ -8322,6 +9157,13 @@ is-plain-obj@^3.0.0: resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" @@ -8392,6 +9234,11 @@ is-typedarray@^1.0.0: resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" @@ -8412,6 +9259,11 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" @@ -8434,6 +9286,11 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + isomorphic-unfetch@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" @@ -8639,12 +9496,24 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" +jest-environment-node@^29.2.1: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jest-get-type@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.4.3: +jest-get-type@^29.4.3, jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== @@ -8765,6 +9634,21 @@ jest-message-util@^29.6.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" @@ -8773,12 +9657,21 @@ jest-mock@^27.5.1: "@jest/types" "^27.5.1" "@types/node" "*" +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.5.1: +jest-regex-util@^27.0.6, jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== @@ -8797,7 +9690,7 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" -jest-resolve@^27.4.2, jest-resolve@^27.5.1: +jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== @@ -8904,6 +9797,18 @@ jest-snapshot@^27.5.1: pretty-format "^27.5.1" semver "^7.3.2" +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" @@ -8940,6 +9845,18 @@ jest-util@^29.6.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" @@ -8952,6 +9869,18 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" +jest-validate@^29.2.1: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + jest-watch-typeahead@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz" @@ -9001,7 +9930,7 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: +jest-worker@^27.0.2, jest-worker@^27.2.0, jest-worker@^27.4.5, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -9019,7 +9948,7 @@ jest-worker@^28.0.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.4.3: +"jest@^27.0.0 || ^28.0.0", jest@^27.4.3: version "27.5.1" resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== @@ -9033,6 +9962,17 @@ jiti@^1.18.2: resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== +joi@^17.2.1: + version "17.10.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.10.1.tgz" + integrity sha512-vIiDxQKmRidUVp8KngT8MZSOcmRVm2zV7jbMjNYWuHcJWI0bUck3nRTGQjhpPlQenIQIBC5Vp9AhcnHbWQqafw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + js-cookie@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" @@ -9058,6 +9998,41 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" + jsdom@^16.6.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -9101,6 +10076,11 @@ jsesc@~0.5.0: resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" @@ -9138,6 +10118,13 @@ json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -9212,7 +10199,7 @@ jss-plugin-vendor-prefixer@^10.10.0: css-vendor "^2.0.8" jss "10.10.0" -jss@10.10.0, jss@^10.10.0: +jss@^10.10.0, jss@10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -9384,6 +10371,23 @@ lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" @@ -9424,6 +10428,14 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" @@ -9465,6 +10477,11 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" @@ -9475,21 +10492,321 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +metro-babel-transformer@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.76.7.tgz" + integrity sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.12.0" + nullthrows "^1.1.1" + +metro-cache-key@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.76.7.tgz" + integrity sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ== + +metro-cache@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-cache/-/metro-cache-0.76.7.tgz" + integrity sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg== + dependencies: + metro-core "0.76.7" + rimraf "^3.0.2" + +metro-config@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-config/-/metro-config-0.76.7.tgz" + 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-core@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-core/-/metro-core-0.76.7.tgz" + integrity sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.76.7" + +metro-file-map@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.76.7.tgz" + 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-inspector-proxy@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.76.7.tgz" + 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-minify-terser@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.76.7.tgz" + integrity sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA== + dependencies: + terser "^5.15.0" + +metro-minify-uglify@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.76.7.tgz" + integrity sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz" + 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-transformer@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.7.tgz" + 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-resolver@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.76.7.tgz" + integrity sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA== + +metro-runtime@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz" + integrity sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + +metro-runtime@0.76.8: + version "0.76.8" + resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz" + integrity sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + +metro-source-map@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz" + 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.8: + version "0.76.8" + resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz" + integrity sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.76.8" + nullthrows "^1.1.1" + ob1 "0.76.8" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.7.tgz" + 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.8: + version "0.76.8" + resolved "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz" + integrity sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w== + dependencies: + invariant "^2.2.4" + metro-source-map "0.76.8" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.76.7.tgz" + 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-worker@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.76.7.tgz" + 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@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/metro/-/metro-0.76.7.tgz" + 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" + micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -9498,7 +10815,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -9510,6 +10827,11 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -9537,7 +10859,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -9556,23 +10878,28 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +"monaco-editor@>= 0.21.0 < 1", "monaco-editor@>= 0.25.0 < 1": + version "0.43.0" + resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.43.0.tgz" + integrity sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -9620,7 +10947,7 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -9638,7 +10965,24 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.1, node-fetch@^2.6.11: +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.11: version "2.6.11" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== @@ -9660,6 +11004,11 @@ node-releases@^2.0.12: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -9695,13 +11044,6 @@ nprogress@^0.2.0: resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - nth-check@^2.0.1: version "2.1.1" resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" @@ -9709,11 +11051,26 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + nwsapi@^2.2.0: version "2.2.7" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== +ob1@0.76.7: + version "0.76.7" + resolved "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz" + integrity sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ== + +ob1@0.76.8: + version "0.76.8" + resolved "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz" + integrity sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g== + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -9813,6 +11170,21 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +oidc-client-ts@^2.2.1, oidc-client-ts@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz" + integrity sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w== + dependencies: + crypto-js "^4.2.0" + jwt-decode "^3.1.2" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -9832,13 +11204,20 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" +open@^6.2.0: + version "6.4.0" + resolved "https://registry.npmjs.org/open/-/open-6.4.0.tgz" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + open@^8.0.9, open@^8.4.0: version "8.4.2" resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" @@ -9887,7 +11266,29 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -p-limit@^2.0.0, p-limit@^2.2.0: +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -9955,6 +11356,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" @@ -10003,7 +11412,12 @@ path-key@^2.0.1: resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -10048,11 +11462,23 @@ pify@^2.3.0: resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pirates@^4.0.1, pirates@^4.0.4: +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" @@ -10607,6 +12033,15 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4, postcss@^8.4.6, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9: + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^7.0.35: version "7.0.39" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" @@ -10615,15 +12050,6 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: - version "8.4.25" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -10641,7 +12067,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.8.7: +prettier@>=2.0.0, prettier@2.8.7: version "2.8.7" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== @@ -10659,6 +12085,26 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-format@^26.5.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" @@ -10678,7 +12124,16 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.6.1: +pretty-format@^29.0.0: + version "29.6.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.6.1: version "29.6.1" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz" integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== @@ -10687,19 +12142,28 @@ pretty-format@^29.0.0, pretty-format@^29.6.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise@^8.1.0: +promise@^8.1.0, promise@^8.3.0: version "8.3.0" resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" -prompts@^2.0.1, prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -10707,7 +12171,7 @@ prompts@^2.0.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@*, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1, prop-types@>=15: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -10731,7 +12195,7 @@ proxy-addr@~2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.33: @@ -10739,16 +12203,16 @@ psl@^1.1.33: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + q@^1.1.2: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" @@ -10761,16 +12225,16 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - querystring@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -10781,6 +12245,13 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" @@ -10879,7 +12350,15 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: +react-devtools-core@^4.27.2: + version "4.28.4" + resolved "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.4.tgz" + integrity sha512-IUZKLv3CimeM07G3vX4H4loxVpByrzq3HvfTX7v9migalwvLs9ZY5D3S3pKR33U+GguYfBBdMMZyToFhsSE/iQ== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +"react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@<18.0.0, react-dom@>=15, react-dom@>=16.6.0, react-dom@>=16.8: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -10933,20 +12412,30 @@ react-if@^4.1.1: resolved "https://registry.npmjs.org/react-if/-/react-if-4.1.5.tgz" integrity sha512-Uk+Ub2gC83PAakuU4+7iLdTEP4LPi2ihNEPCtz/vr8SLGbzkMApbpYbkDZ5z9zYXurd0gg+EK/bpOLFFC1r1eQ== -react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.2: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1, react-is@^17.0.2: +react-is@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-native-get-random-values@^1.4.0: version "1.9.0" @@ -10962,19 +12451,54 @@ react-native-url-polyfill@^1.3.0: dependencies: whatwg-url-without-unicode "8.0.0-3" -react-redux@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.1.tgz#0d423e2c1cb10ada87293d47e7de7c329623ba4d" - integrity sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ== - dependencies: - "@babel/runtime" "^7.3.1" - hoist-non-react-statics "^3.3.0" +react-native@*, react-native@>=0.56: + version "0.72.4" + resolved "https://registry.npmjs.org/react-native/-/react-native-0.72.4.tgz" + integrity sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "11.3.6" + "@react-native-community/cli-platform-android" "11.3.6" + "@react-native-community/cli-platform-ios" "11.3.6" + "@react-native/assets-registry" "^0.72.0" + "@react-native/codegen" "^0.72.6" + "@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.8" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "4.1.0" + event-target-shim "^5.0.1" + flow-enums-runtime "^0.0.5" invariant "^2.2.4" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.8.2" + jest-environment-node "^29.2.1" + jsc-android "^250231.0.0" + memoize-one "^5.0.0" + metro-runtime "0.76.8" + metro-source-map "0.76.8" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.27.2" + react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" + regenerator-runtime "^0.13.2" + scheduler "0.24.0-canary-efb381bbf-20230505" + stacktrace-parser "^0.1.10" + use-sync-external-store "^1.0.0" + whatwg-fetch "^3.0.0" + ws "^6.2.2" + yargs "^17.6.2" + +react-oidc-context@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/react-oidc-context/-/react-oidc-context-2.3.1.tgz" + integrity sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q== -react-redux@^7.2.6: +"react-redux@^7.2.1 || ^8.0.2", react-redux@^7.2.6: version "7.2.9" resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz" integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== @@ -10986,11 +12510,16 @@ react-redux@^7.2.6: prop-types "^15.7.2" react-is "^17.0.2" -react-refresh@^0.11.0: +react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0": version "0.11.0" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + react-router-dom@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.0.0.tgz" @@ -11060,6 +12589,14 @@ react-scripts@^5.0.1: optionalDependencies: fsevents "^2.3.2" +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" @@ -11070,7 +12607,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^17.0.2: +react@*, "react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react@^15.0.0 || >=16.0.0", "react@^15.3.0 || 16 || 17 || 18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.3 || ^17 || ^18", "react@^16.9.0 || ^17.0.0 || ^18", "react@^16.x || ^17.x || ^18.x", react@^17.0.0, "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", react@<18.0.0, "react@>= 16", "react@>= 16.8", react@>=0.13, react@>=0.13.x, react@>=0.14.x, react@>=15, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, "react@~0.13.x || ~0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -11078,6 +12615,13 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" +react@18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" @@ -11098,7 +12642,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: +readable-stream@^3.0.6, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -11107,6 +12651,19 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -11114,6 +12671,21 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== + dependencies: + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + recursive-readdir@^2.2.2: version "2.2.3" resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" @@ -11134,7 +12706,7 @@ redux-thunk@^2.3.0, redux-thunk@^2.4.2: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@^4.0.0, redux@^4.2.1: +redux@^4, redux@^4.0.0, redux@^4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -11153,6 +12725,11 @@ regenerate@^1.4.2: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== +regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" @@ -11229,6 +12806,11 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" @@ -11246,6 +12828,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -11295,6 +12882,14 @@ response-iterator@^0.2.6: resolved "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz" integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + retry@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" @@ -11317,6 +12912,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rollup-plugin-terser@^7.0.0: version "7.0.2" resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" @@ -11327,7 +12929,7 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup@^2.43.1: +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1: version "2.79.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== @@ -11351,15 +12953,20 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: version "1.0.0" @@ -11408,14 +13015,12 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + loose-envify "^1.1.0" schema-utils@^2.6.5: version "2.7.1" @@ -11445,6 +13050,15 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" @@ -11457,17 +13071,55 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@^5.5.0: +semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.2: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.2: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -11493,6 +13145,11 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" @@ -11520,7 +13177,7 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: +serve-static@^1.13.1, serve-static@1.15.0: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== @@ -11530,6 +13187,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" @@ -11540,6 +13202,13 @@ setprototypeof@1.2.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" @@ -11569,7 +13238,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.8.1" resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -11628,6 +13297,15 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" @@ -11656,7 +13334,7 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -11664,15 +13342,20 @@ source-map-support@^0.5.6, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.6.1, source-map@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.3: version "0.7.4" @@ -11686,6 +13369,16 @@ source-map@^0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" @@ -11736,21 +13429,33 @@ stackframe@^1.3.4: resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + state-local@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz" integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" @@ -11758,6 +13463,20 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" @@ -11779,7 +13498,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11829,20 +13548,6 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -11852,6 +13557,20 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -11934,6 +13653,11 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -11994,7 +13718,7 @@ svg.filter.js@^2.0.2: dependencies: svg.js "^2.2.5" -svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: +svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@>=2.3.x: version "2.7.1" resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== @@ -12119,6 +13843,13 @@ temp-dir@^2.0.0: resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + tempy@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" @@ -12148,7 +13879,7 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: +terser@^5.0.0, terser@^5.10.0, terser@^5.15.0, terser@^5.16.8: version "5.18.2" resolved "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz" integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== @@ -12186,11 +13917,24 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + throat@^6.0.1: version "6.0.2" resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz" integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + thunky@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" @@ -12296,21 +14040,31 @@ tsconfig-paths@^3.14.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== +tslib@^1.10.0, tslib@^1.8.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^1.11.1, tslib@^1.8.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.0: version "2.6.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -12342,7 +14096,7 @@ type-fest@^0.16.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== -type-fest@^0.20.2: +type-fest@^0.20.2, "type-fest@>=0.17.0 <4.0.0": version "0.20.2" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== @@ -12352,6 +14106,11 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" @@ -12376,6 +14135,19 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +"typescript@^3.2.1 || ^4", "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + ulid@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz" @@ -12434,6 +14206,11 @@ universal-cookie@^4.0.4: "@types/cookie" "^0.3.3" cookie "^0.4.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" @@ -12444,7 +14221,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -12492,7 +14269,7 @@ url-search-params-polyfill@^7.0.0: resolved "https://registry.npmjs.org/url-search-params-polyfill/-/url-search-params-polyfill-7.0.1.tgz" integrity sha512-bAw7L2E+jn9XHG5P9zrPnHdO0yJub4U+yXJOdpcpkr7OBd9T8oll4lUos0iSGRcDvfZoLUKfx9a6aNmIhJ4+mQ== -url@0.11.0, url@^0.11.0: +url@^0.11.0, url@0.11.0: version "0.11.0" resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== @@ -12500,6 +14277,11 @@ url@0.11.0, url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -12525,7 +14307,7 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@3.4.0, uuid@^3.0.0, uuid@^3.2.1: +uuid@^3.0.0, uuid@^3.2.1, uuid@3.4.0: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -12549,6 +14331,11 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" @@ -12593,6 +14380,13 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + web-vitals@^2.1.4: version "2.1.4" resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz" @@ -12629,7 +14423,7 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.6.0: +webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x": version "4.15.1" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== @@ -12694,7 +14488,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.64.4: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0": version "5.88.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz" integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== @@ -12724,7 +14518,7 @@ webpack@^5.64.4: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -12745,7 +14539,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.6.2: +whatwg-fetch@^3.0.0, whatwg-fetch@^3.6.2: version "3.6.2" resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== @@ -12781,7 +14575,16 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: +whatwg-url@^8.0.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== @@ -12811,6 +14614,11 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" @@ -13011,6 +14819,15 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -13025,6 +14842,15 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" @@ -13035,7 +14861,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^7.4.6: +ws@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -13063,6 +14896,16 @@ xss@^1.0.11: commander "^2.20.3" cssfilter "0.0.10" +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" @@ -13088,11 +14931,46 @@ yaml@^2.1.1: resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== +yaml@^2.2.1: + version "2.3.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -13106,6 +14984,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" @@ -13124,14 +15015,6 @@ yup@^0.32.11: property-expr "^2.0.4" toposort "^2.0.2" -zen-observable-ts@0.8.19: - version "0.8.19" - resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz" - integrity sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - zen-observable-ts@^0.8.21: version "0.8.21" resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz" @@ -13147,16 +15030,24 @@ zen-observable-ts@^1.2.5: dependencies: zen-observable "0.8.15" -zen-observable@0.8.15, zen-observable@^0.8.0: - version "0.8.15" - resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== +zen-observable-ts@0.8.19: + version "0.8.19" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz" + integrity sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" zen-observable@^0.7.0: version "0.7.1" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz" integrity sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg== +zen-observable@^0.8.0, zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + zen-push@0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/zen-push/-/zen-push-0.2.1.tgz" From 622b923ef7212262f738b233afac4556e346dc76 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Sun, 3 Dec 2023 18:41:32 -0600 Subject: [PATCH 06/17] Fixing Semgrep Error in Frontend --- .../contexts/GenericAuthContext.js | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/frontend/src/authentication/contexts/GenericAuthContext.js b/frontend/src/authentication/contexts/GenericAuthContext.js index a018447df..94ee5a8da 100644 --- a/frontend/src/authentication/contexts/GenericAuthContext.js +++ b/frontend/src/authentication/contexts/GenericAuthContext.js @@ -174,15 +174,15 @@ export const GenericAuthProvider = (props) => { if (CUSTOM_AUTH) { if (!auth.user) throw Error('User not initialized'); return { - email: await getDataFromClaimsMapping( - process.env.REACT_APP_CUSTOM_AUTH_EMAIL_CLAIM_MAPPING, - auth.user.profile - ), + email: + auth.user.profile[ + process.env.REACT_APP_CUSTOM_AUTH_EMAIL_CLAIM_MAPPING + ], id_token: auth.user.id_token, - short_id: await getDataFromClaimsMapping( - process.env.REACT_APP_CUSTOM_AUTH_USERID_CLAIM_MAPPING, - auth.user.profile - ) + short_id: + auth.user.profile[ + process.env.REACT_APP_CUSTOM_AUTH_USERID_CLAIM_MAPPING + ] }; } else { const user = await Auth.currentAuthenticatedUser(); @@ -194,19 +194,6 @@ export const GenericAuthProvider = (props) => { } }; - // Used to map custom profile claims sent from the IDP - // This mapping is provided in the cdk.json at the time of deployment - const getDataFromClaimsMapping = async (mappingStr, userProfile) => { - // mapping str consist of path to from the user object to the claim information - // For e.g. profile.email or profile.primary_email, etc - const claimsList = mappingStr.split('.'); - let _userProfile = userProfile; - for (const claim of claimsList) { - _userProfile = _userProfile[claim]; - } - return _userProfile; - }; - // Function to process OIDC State when it transitions from false to true function processLoadingStateChange() { if (isLoading) { From 83d482b221dddea8a47b46892fea423b635d52dc Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Mon, 4 Dec 2023 18:45:33 -0600 Subject: [PATCH 07/17] Added Redirect URL as a config --- deploy/configs/frontend_config.py | 2 ++ deploy/stacks/pipeline.py | 1 + frontend/src/authentication/contexts/OidcAuthContext.js | 2 +- template_cdk.json | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/deploy/configs/frontend_config.py b/deploy/configs/frontend_config.py index 75a8e0065..ed6851ad1 100644 --- a/deploy/configs/frontend_config.py +++ b/deploy/configs/frontend_config.py @@ -74,6 +74,7 @@ def create_react_env_file( if custom_auth: file_content = file_content + f"""REACT_APP_CUSTOM_AUTH={custom_auth.get("provider", "none")} REACT_APP_CUSTOM_AUTH_URL={custom_auth.get("url", "none")} +REACT_APP_CUSTOM_AUTH_REDIRECT_URL={custom_auth.get("redirect_url", "none")} REACT_APP_CUSTOM_AUTH_CLIENT_ID={custom_auth.get("client_id", "none")} REACT_APP_CUSTOM_AUTH_RESP_TYPES={custom_auth.get("response_types", "none")} REACT_APP_CUSTOM_AUTH_SCOPES={custom_auth.get("scopes", "none")} @@ -148,6 +149,7 @@ def create_react_env_file( if os.environ.get("custom_auth_provider", "None") != "None": custom_auth_properties["provider"] = os.environ.get("custom_auth_provider", "None") custom_auth_properties["url"] = os.environ.get("custom_auth_url", "None") + custom_auth_properties["redirect_url"] = os.environ.get("custom_auth_redirect_url", "None") custom_auth_properties["client_id"] = os.environ.get("custom_auth_client_id", "None") custom_auth_properties["response_types"] = os.environ.get("custom_auth_response_types", "None") custom_auth_properties["scopes"] = os.environ.get("custom_auth_scopes", "None") diff --git a/deploy/stacks/pipeline.py b/deploy/stacks/pipeline.py index 6d6f60b97..98840e08f 100644 --- a/deploy/stacks/pipeline.py +++ b/deploy/stacks/pipeline.py @@ -746,6 +746,7 @@ def set_cloudfront_stage(self, target_env): f'export reauth_ttl={str(target_env.get("reauth_config", {}).get("ttl", 5))}', f'export custom_auth_provider={str(target_env.get("custom_auth", {}).get("provider", "None"))}', f'export custom_auth_url={str(target_env.get("custom_auth", {}).get("url", "None"))}', + f'export custom_auth_redirect_url={str(target_env.get("custom_auth", {}).get("redirect_url", "None"))}', f'export custom_auth_client_id={str(target_env.get("custom_auth", {}).get("client_id", "None"))}', f'export custom_auth_response_types={str(target_env.get("custom_auth", {}).get("response_types", "None"))}', f'export custom_auth_scopes={str(target_env.get("custom_auth", {}).get("scopes", "None"))}', diff --git a/frontend/src/authentication/contexts/OidcAuthContext.js b/frontend/src/authentication/contexts/OidcAuthContext.js index aeacb93c8..484e491d8 100644 --- a/frontend/src/authentication/contexts/OidcAuthContext.js +++ b/frontend/src/authentication/contexts/OidcAuthContext.js @@ -7,7 +7,7 @@ import { RequestContextProvider } from '../../reauthentication'; const oidcConfig = { authority: process.env.REACT_APP_CUSTOM_AUTH_URL, client_id: process.env.REACT_APP_CUSTOM_AUTH_CLIENT_ID, - redirect_uri: `${window.location.origin}`, + redirect_uri: process.env.REACT_APP_CUSTOM_AUTH_REDIRECT_URL, response_type: process.env.REACT_APP_CUSTOM_AUTH_RESP_TYPES, scope: process.env.REACT_APP_CUSTOM_AUTH_SCOPES, automaticSilentRenew: false, diff --git a/template_cdk.json b/template_cdk.json index c8f4904c9..817f5efb2 100644 --- a/template_cdk.json +++ b/template_cdk.json @@ -48,7 +48,8 @@ "cognito_user_session_timeout_inmins": "integer_COGNITO_USER_SESSION_TIMEOUT_INMINS|DEFAULT=43200", "custom_auth": { "provider": "string_EXTERNAL_IDP_PROVIDER_NAME|DEFAULT=None", - "url" : "string_HTTPS_ISSUER_URL_OF_THE_EXTERNAL_IDP|DEFAULT=None", + "url" : "string_ISSUER_URL_OF_THE_EXTERNAL_IDP|DEFAULT=None", + "redirect_url" : "string_REDIRECT_URL_OF_THE_EXTERNAL_IDP|DEFAULT=None", "client_id": "string_EXTERNAL_IDP_CLIENT_ID|DEFAULT=None", "response_types": "string_EXTERNAL_RESPONSE_TYPES_USED_IN_OIDC_FLOW|DEFAULT=None", "scopes": "string_EXTERNAL_IDP_SCOPES_SPACE_SEPARATED|DEFAULT=None", From e940a6cef582f971904ff3deb9def4019b5fdfab Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Tue, 5 Dec 2023 15:54:51 -0600 Subject: [PATCH 08/17] Addressing Changes from review comments --- backend/api_handler.py | 6 +- deploy/configs/frontend_config.py | 2 +- .../custom_authorizer_lambda.py | 1 + deploy/stacks/cloudfront.py | 65 ++++++++++--------- deploy/stacks/lambda_api.py | 7 +- deploy/stacks/pipeline.py | 17 +---- .../contexts/GenericAuthContext.js | 3 - frontend/src/services/hooks/useGroups.js | 8 --- 8 files changed, 51 insertions(+), 58 deletions(-) diff --git a/backend/api_handler.py b/backend/api_handler.py index 031fb6a9c..cbc5877ea 100644 --- a/backend/api_handler.py +++ b/backend/api_handler.py @@ -63,7 +63,7 @@ def adapted(obj, info, **kwargs): print(f'Lambda Context ' f'Initialization took: {end - start:.3f} sec') -def get_groups(claims): +def get_cognito_groups(claims): if not claims: raise ValueError( 'Received empty claims. ' 'Please verify authorizer configuration', @@ -131,10 +131,12 @@ def handler(event, context): username = claims['email'] log.debug('username is %s', username) try: - groups = get_groups(claims) + groups = [] if (os.environ.get('custom_auth', None)): user_id = event['requestContext']['authorizer']['user_id'] groups.extend(get_custom_groups(user_id)) + else: + groups.extend(get_cognito_groups(claims)) log.debug('groups are %s', ",".join(groups)) with ENGINE.scoped_session() as session: for group in groups: diff --git a/deploy/configs/frontend_config.py b/deploy/configs/frontend_config.py index ed6851ad1..4b6508987 100644 --- a/deploy/configs/frontend_config.py +++ b/deploy/configs/frontend_config.py @@ -67,7 +67,6 @@ def create_react_env_file( file_content = f"""GENERATE_SOURCEMAP=false REACT_APP_GRAPHQL_API={graphql_api_url} REACT_APP_SEARCH_API={search_api_url} -REACT_APP_USERGUIDE_LINK=https://{user_guide_link} REACT_APP_ENABLE_PIVOT_ROLE_AUTO_CREATE={pivot_role_auto_create} REACT_APP_REAUTH_TTL={reauth_ttl} """ @@ -87,6 +86,7 @@ def create_react_env_file( REACT_APP_COGNITO_DOMAIN={domain} REACT_APP_COGNITO_REDIRECT_SIGNIN=https://{signin_singout_link} REACT_APP_COGNITO_REDIRECT_SIGNOUT=https://{signin_singout_link} +REACT_APP_USERGUIDE_LINK=https://{user_guide_link} """ print('.env content: \n', file_content) diff --git a/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py index aadc894d6..c1c2f1b5b 100644 --- a/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py +++ b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py @@ -33,6 +33,7 @@ def lambda_handler(incoming_event, context): return policy +# Below Code only used for testing on local development IDE # the following is useful to make this script executable in both # AWS Lambda and any other local environments if __name__ == '__main__': diff --git a/deploy/stacks/cloudfront.py b/deploy/stacks/cloudfront.py index 87e6e6869..0361d4ecd 100644 --- a/deploy/stacks/cloudfront.py +++ b/deploy/stacks/cloudfront.py @@ -330,19 +330,35 @@ def __init__( string_value=cloudfront_bucket.bucket_name, ) - userguide_docs_distribution, user_docs_bucket = self.build_static_site( - f'userguide', - acl, - auth_at_edge, - envname, - resource_prefix, - userguide_domain_names, - certificate, - ssl_support_method, - security_policy, - logging_bucket, - custom_auth - ) if custom_auth is None else (None, None) + self.user_docs_bucket = None + if custom_auth is None: + userguide_docs_distribution, user_docs_bucket = self.build_static_site( + f'userguide', + acl, + auth_at_edge, + envname, + resource_prefix, + userguide_domain_names, + certificate, + ssl_support_method, + security_policy, + logging_bucket + ) + + self.userguide_docs_distribution = userguide_docs_distribution + self.user_docs_bucket = user_docs_bucket + + if userguide_alternate_domain: + route53.ARecord( + self, + 'CloudFrontUserguideDomain', + record_name=userguide_alternate_domain, + zone=hosted_zone, + target=route53.RecordTarget.from_alias( + route53_targets.CloudFrontTarget(userguide_docs_distribution) + ), + ) + if frontend_alternate_domain: frontend_record = route53.ARecord( self, @@ -353,16 +369,6 @@ def __init__( route53_targets.CloudFrontTarget(cloudfront_distribution) ), ) - if userguide_alternate_domain and custom_auth != None: - userguide_record = route53.ARecord( - self, - 'CloudFrontUserguideDomain', - record_name=userguide_alternate_domain, - zone=hosted_zone, - target=route53.RecordTarget.from_alias( - route53_targets.CloudFrontTarget(userguide_docs_distribution) - ), - ) if tooling_account_id: cross_account_deployment_role = iam.Role( @@ -373,8 +379,8 @@ def __init__( ) resources_for_cross_account = [] resources_for_cross_account.append(f'{cloudfront_bucket.bucket_arn}/*') - if custom_auth is None: - resources_for_cross_account.append(f'{user_docs_bucket.bucket_arn}/*') + if self.user_docs_bucket is not None: + resources_for_cross_account.append(f'{self.user_docs_bucket.bucket_arn}/*') cross_account_deployment_role.add_to_policy( iam.PolicyStatement( actions=[ @@ -436,8 +442,6 @@ def __init__( self.frontend_distribution = cloudfront_distribution self.frontend_bucket = cloudfront_bucket - self.user_docs_bucket = user_docs_bucket if custom_auth is not None else None - self.user_docs_distribution = userguide_docs_distribution if custom_auth is not None else None self.cross_account_deployment_role = ( cross_account_deployment_role.role_name if cross_account_deployment_role @@ -494,8 +498,7 @@ def build_static_site( certificate, ssl_support_method, security_policy, - logging_bucket, - custom_auth + logging_bucket ): # Lambda@edge for http_header_redirection @@ -507,6 +510,10 @@ def build_static_site( 'docs_http_headers', ) ) + + if not os.path.isdir(docs_http_headers): + raise Exception(f"Custom Authorizer Folder not found at {docs_http_headers}") + ( self.http_header_func, self.http_header_func_version, diff --git a/deploy/stacks/lambda_api.py b/deploy/stacks/lambda_api.py index 5e63f8a17..4ec0cdb64 100644 --- a/deploy/stacks/lambda_api.py +++ b/deploy/stacks/lambda_api.py @@ -168,6 +168,9 @@ def __init__( ) ) + if not os.path.isdir(custom_authorizer_assets): + raise Exception(f"Custom Authorizer Folder not found at {custom_authorizer_assets}") + custom_lambda_env = { 'envname': envname, 'LOG_LEVEL': 'DEBUG', @@ -180,6 +183,7 @@ def __init__( for claims_map in custom_auth.get('claims_mapping', {}): custom_lambda_env[claims_map] = custom_auth.get('claims_mapping', '').get(claims_map, '') + authorizerfn_sg = self.create_lambda_sgs(envname, "customauthorizer", resource_prefix, vpc) self.authorizer_fn = _lambda.Function( self, f'CustomAuthorizerFunction-{envname}', @@ -196,6 +200,7 @@ def __init__( description='dataall Custom authorizer replacing cognito authorizer', timeout=Duration.seconds(20), environment=custom_lambda_env, + security_groups=[authorizerfn_sg], vpc=vpc, runtime=_lambda.Runtime.PYTHON_3_9, ) @@ -507,7 +512,7 @@ def set_up_graphql_api_gateway( else: #Create a custom Authorizer custom_authorizer_role = iam.Role(self, - 'custom-auth-role', + f'{resource_prefix}-{envname}-custom-authorizer-role', assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"), description="Allow Custom Authorizer to call custom auth lambda" ) diff --git a/deploy/stacks/pipeline.py b/deploy/stacks/pipeline.py index 98840e08f..c14d7e4fc 100644 --- a/deploy/stacks/pipeline.py +++ b/deploy/stacks/pipeline.py @@ -951,24 +951,13 @@ def set_albfront_stage(self, target_env, repository_name): role=self.expanded_codebuild_role.without_policy_updates(), vpc=self.vpc, ), - ], - post=self.evaluate_post_albfront_stage(target_env) + ] ) - - def evaluate_post_albfront_stage(self, target_env): - post = [] if target_env.get('custom_auth') is None: - post.append(self.cognito_config_action(target_env)) + albfront_stage.add_post(self.cognito_config_action(target_env)) if target_env.get('enable_cw_rum', False): - post.append(self.cw_rum_config_action(target_env)) - - if len(post) == 0: - post.append(pipelines.CodeBuildStep( - id='CodeBuildPlaceHolder', - commands=['echo "Skipping Cognito Config Setup as using Custom Auth" '] - )) - return post + albfront_stage.add_post(self.cw_rum_config_action(target_env)) def set_release_stage( self, diff --git a/frontend/src/authentication/contexts/GenericAuthContext.js b/frontend/src/authentication/contexts/GenericAuthContext.js index 94ee5a8da..d83d0f0f7 100644 --- a/frontend/src/authentication/contexts/GenericAuthContext.js +++ b/frontend/src/authentication/contexts/GenericAuthContext.js @@ -164,7 +164,6 @@ export const GenericAuthProvider = (props) => { user: null } }); - window.localStorage.removeItem('user_groups'); }); }); } @@ -240,7 +239,6 @@ export const GenericAuthProvider = (props) => { user: null } }); - window.localStorage.removeItem('user_groups'); } else { await Auth.signOut(); dispatch({ @@ -267,7 +265,6 @@ export const GenericAuthProvider = (props) => { requestInfo: null } }); - window.localStorage.removeItem('user_groups'); }); } catch (error) { console.error('Failed to ReAuth', error); diff --git a/frontend/src/services/hooks/useGroups.js b/frontend/src/services/hooks/useGroups.js index ef330f2fb..dba21b7ec 100644 --- a/frontend/src/services/hooks/useGroups.js +++ b/frontend/src/services/hooks/useGroups.js @@ -17,10 +17,6 @@ export const useGroups = () => { ) { setGroups(['Engineers', 'Scientists', 'DAAdministrators']); } else if (process.env.REACT_APP_CUSTOM_AUTH) { - if (window.localStorage.getItem('user_groups') != null) { - setGroups(window.localStorage.getItem('user_groups').split(',')); - return; - } if (!auth.user) { dispatch({ type: SET_ERROR, @@ -32,10 +28,6 @@ export const useGroups = () => { const response = await client.query(getGroupsForUser(auth.user.short_id)); if (!response.error) { setGroups(response.data.getGroupsForUser); - window.localStorage.setItem( - 'user_groups', - response.data.getGroupsForUser.join(',') - ); } else { dispatch({ type: SET_ERROR, error: response.error }); } From 393a28252d740d50c0fbf6d2c5dd5f261764db98 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Tue, 5 Dec 2023 16:15:17 -0600 Subject: [PATCH 09/17] Minor Corections --- deploy/stacks/cloudfront.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/stacks/cloudfront.py b/deploy/stacks/cloudfront.py index 0361d4ecd..2125628b7 100644 --- a/deploy/stacks/cloudfront.py +++ b/deploy/stacks/cloudfront.py @@ -512,7 +512,7 @@ def build_static_site( ) if not os.path.isdir(docs_http_headers): - raise Exception(f"Custom Authorizer Folder not found at {docs_http_headers}") + raise Exception(f"Http Docs Headers Folder not found at {docs_http_headers}") ( self.http_header_func, From 6f3aee3c96b0c999ff41b5eb70ea7154470cdb78 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 8 Dec 2023 12:33:45 -0600 Subject: [PATCH 10/17] Frontend Global Imports, Backend Validation for custom auth params and alb frontend changes as per custom auth --- deploy/stacks/albfront_stack.py | 116 +++++++++--------- deploy/stacks/albfront_stage.py | 2 + deploy/stacks/lambda_api.py | 10 +- deploy/stacks/pipeline.py | 109 +++++++++++----- .../authentication/components/GuestGuard.js | 2 +- frontend/src/authentication/hooks/useToken.js | 2 +- .../components/popovers/AccountPopover.js | 2 +- .../contexts/RequestContext.js | 2 +- .../graphql/Groups/getGroupsForUser.js} | 0 frontend/src/services/graphql/Groups/index.js | 1 + .../graphql/Groups/listCognitoGroups.js | 14 --- frontend/src/services/hooks/useGroups.js | 6 +- 12 files changed, 154 insertions(+), 112 deletions(-) rename frontend/src/{authentication/services/getServiceProviderInfo.js => services/graphql/Groups/getGroupsForUser.js} (100%) delete mode 100644 frontend/src/services/graphql/Groups/listCognitoGroups.js diff --git a/deploy/stacks/albfront_stack.py b/deploy/stacks/albfront_stack.py index 52e2b28c9..cebd7f46d 100644 --- a/deploy/stacks/albfront_stack.py +++ b/deploy/stacks/albfront_stack.py @@ -28,6 +28,7 @@ def __init__( image_tag=None, custom_domain=None, ip_ranges=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -220,65 +221,66 @@ def __init__( ) self.allow_alb_access(frontend_alb, ip_ranges, vpc) - userguide_sg = ec2.SecurityGroup( - self, - 'FargateTaskUserGuideSG', - security_group_name=f'{resource_prefix}-{envname}-userguide-service-sg', - vpc=vpc, - allow_all_outbound=True, - ) - userguide_alb = ecs_patterns.ApplicationLoadBalancedFargateService( - self, - f'UserGuideService{envname}', - cluster=cluster, - cpu=1024, - memory_limit_mib=2048, - service_name=f'userguide-{envname}', - desired_count=1, - certificate=certificate if (custom_domain and custom_domain.get('certificate_arn')) else None, - domain_name=userguide_alternate_domain, - domain_zone=hosted_zone, - task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions( - container_port=80, - environment={ - 'AWS_REGION': self.region, - 'envname': envname, - 'LOGLEVEL': 'DEBUG', - }, - task_role=task_role, - image=ecs.ContainerImage.from_ecr_repository( - repository=ecr_repository, tag=userguide_image_tag - ), - enable_logging=True, - log_driver=ecs.LogDriver.aws_logs( - stream_prefix='service', - log_group=self.create_log_group( - envname, resource_prefix, log_group_name='userguide' + if custom_auth is None: + userguide_sg = ec2.SecurityGroup( + self, + 'FargateTaskUserGuideSG', + security_group_name=f'{resource_prefix}-{envname}-userguide-service-sg', + vpc=vpc, + allow_all_outbound=True, + ) + userguide_alb = ecs_patterns.ApplicationLoadBalancedFargateService( + self, + f'UserGuideService{envname}', + cluster=cluster, + cpu=1024, + memory_limit_mib=2048, + service_name=f'userguide-{envname}', + desired_count=1, + certificate=certificate if (custom_domain and custom_domain.get('certificate_arn')) else None, + domain_name=userguide_alternate_domain, + domain_zone=hosted_zone, + task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions( + container_port=80, + environment={ + 'AWS_REGION': self.region, + 'envname': envname, + 'LOGLEVEL': 'DEBUG', + }, + task_role=task_role, + image=ecs.ContainerImage.from_ecr_repository( + repository=ecr_repository, tag=userguide_image_tag + ), + enable_logging=True, + log_driver=ecs.LogDriver.aws_logs( + stream_prefix='service', + log_group=self.create_log_group( + envname, resource_prefix, log_group_name='userguide' + ), ), ), - ), - public_load_balancer=False, - assign_public_ip=False, - open_listener=False, - max_healthy_percent=100, - min_healthy_percent=0, - security_groups=[userguide_sg], - ) - ulb: elb.CfnLoadBalancer = userguide_alb.load_balancer.node.default_child - ulb.access_logging_policy = elb.CfnLoadBalancer.AccessLoggingPolicyProperty( - enabled=True, - s3_bucket_name=logs_bucket.bucket_name, - s3_bucket_prefix='userguide', - ) - userguide_alb.target_group.configure_health_check( - port='80', - path='/', - timeout=Duration.seconds(10), - healthy_threshold_count=2, - unhealthy_threshold_count=2, - interval=Duration.seconds(15), - ) - self.allow_alb_access(userguide_alb, ip_ranges, vpc) + public_load_balancer=False, + assign_public_ip=False, + open_listener=False, + max_healthy_percent=100, + min_healthy_percent=0, + security_groups=[userguide_sg], + ) + ulb: elb.CfnLoadBalancer = userguide_alb.load_balancer.node.default_child + ulb.access_logging_policy = elb.CfnLoadBalancer.AccessLoggingPolicyProperty( + enabled=True, + s3_bucket_name=logs_bucket.bucket_name, + s3_bucket_prefix='userguide', + ) + userguide_alb.target_group.configure_health_check( + port='80', + path='/', + timeout=Duration.seconds(10), + healthy_threshold_count=2, + unhealthy_threshold_count=2, + interval=Duration.seconds(15), + ) + self.allow_alb_access(userguide_alb, ip_ranges, vpc) CfnOutput( self, diff --git a/deploy/stacks/albfront_stage.py b/deploy/stacks/albfront_stage.py index 3b641101e..6c84f4a21 100644 --- a/deploy/stacks/albfront_stage.py +++ b/deploy/stacks/albfront_stage.py @@ -16,6 +16,7 @@ def __init__( image_tag=None, custom_domain=None, ip_ranges=None, + custom_auth=None, **kwargs, ): super().__init__(scope, id, **kwargs) @@ -29,6 +30,7 @@ def __init__( image_tag=image_tag, custom_domain=custom_domain, ip_ranges=ip_ranges, + custom_auth=custom_auth ) Tags.of(albfront_stack).add('Application', f'{resource_prefix}-{envname}') diff --git a/deploy/stacks/lambda_api.py b/deploy/stacks/lambda_api.py index 4ec0cdb64..137bf2b79 100644 --- a/deploy/stacks/lambda_api.py +++ b/deploy/stacks/lambda_api.py @@ -183,7 +183,7 @@ def __init__( for claims_map in custom_auth.get('claims_mapping', {}): custom_lambda_env[claims_map] = custom_auth.get('claims_mapping', '').get(claims_map, '') - authorizerfn_sg = self.create_lambda_sgs(envname, "customauthorizer", resource_prefix, vpc) + authorizer_fn_sg = self.create_lambda_sgs(envname, "customauthorizer", resource_prefix, vpc) self.authorizer_fn = _lambda.Function( self, f'CustomAuthorizerFunction-{envname}', @@ -200,9 +200,9 @@ def __init__( description='dataall Custom authorizer replacing cognito authorizer', timeout=Duration.seconds(20), environment=custom_lambda_env, - security_groups=[authorizerfn_sg], vpc=vpc, - runtime=_lambda.Runtime.PYTHON_3_9, + security_groups=[authorizer_fn_sg], + runtime=_lambda.Runtime.PYTHON_3_9 ) # Add NAT Connectivity For Custom Authorizer Lambda @@ -513,6 +513,7 @@ def set_up_graphql_api_gateway( #Create a custom Authorizer custom_authorizer_role = iam.Role(self, f'{resource_prefix}-{envname}-custom-authorizer-role', + role_name=f'{resource_prefix}-{envname}-custom-authorizer-role', assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"), description="Allow Custom Authorizer to call custom auth lambda" ) @@ -528,7 +529,8 @@ def set_up_graphql_api_gateway( handler=self.authorizer_fn, identity_sources=[apigw.IdentitySource.header('Authorization')], authorizer_name=f'{resource_prefix}-{envname}-custom-authorizer', - assume_role=custom_authorizer_role + assume_role=custom_authorizer_role, + results_cache_ttl=Duration.minutes(60), ) if not internet_facing: if apig_vpce: diff --git a/deploy/stacks/pipeline.py b/deploy/stacks/pipeline.py index c14d7e4fc..5a8564437 100644 --- a/deploy/stacks/pipeline.py +++ b/deploy/stacks/pipeline.py @@ -422,6 +422,39 @@ def validate_deployment_params(self, source, repo_connection_arn, git_branch, re f'must be less than 50 characters to avoid AWS resources naming limits' ) + # Validate if all configs are present when deploying custom_auth + for env in target_envs: + if 'custom_auth' in env: + custom_auth_configs = env.get('custom_auth') + if ('url' not in custom_auth_configs or + 'provider' not in custom_auth_configs or + 'redirect_url' not in custom_auth_configs or + 'client_id' not in custom_auth_configs or + 'response_types' not in custom_auth_configs or + 'scopes' not in custom_auth_configs or + 'jwks_url' not in custom_auth_configs or + 'claims_mapping' not in custom_auth_configs or + 'user_id' not in custom_auth_configs['claims_mapping'] or + 'email' not in custom_auth_configs['claims_mapping'] + ): + raise ValueError( + 'Custom Auth Configuration Error : Missing some configurations in custom_auth section in Deployments. Please take a look at template_cdk.json for reference or visit the data.all webpage and checkout the Deploy to AWS section' + ) + + if (not isinstance(custom_auth_configs['url'], str) or + not isinstance(custom_auth_configs['provider'], str) or + not isinstance(custom_auth_configs['redirect_url'], str) or + not isinstance(custom_auth_configs['client_id'], str) or + not isinstance(custom_auth_configs['response_types'], str) or + not isinstance(custom_auth_configs['scopes'], str) or + not isinstance(custom_auth_configs['jwks_url'], str) or + not isinstance(custom_auth_configs['claims_mapping']['user_id'], str) or + not isinstance(custom_auth_configs['claims_mapping']['email'], str) + ): + raise TypeError( + 'Custom Auth Configuration Error : Type error: Configs type is not as required. Please take a look at template_cdk.json for reference or visit the data.all webpage and checkout the Deploy to AWS section' + ) + def set_quality_gate_stage(self): quality_gate_param = self.node.try_get_context('quality_gate') if quality_gate_param is not False: @@ -636,7 +669,7 @@ def set_backend_stage(self, target_env, repository_name): apig_vpce=target_env.get('apig_vpce'), prod_sizing=target_env.get('prod_sizing', True), quicksight_enabled=target_env.get('enable_quicksight_monitoring', False), - enable_cw_rum=target_env.get('enable_cw_rum', False), + enable_cw_rum=target_env.get('enable_cw_rum', False) and target_env.get("custom_auth", None) == None, enable_cw_canaries=target_env.get('enable_cw_canaries', False) and target_env.get("custom_auth", None) == None, shared_dashboard_sessions=target_env.get('shared_dashboard_sessions', 'anonymous'), enable_opensearch_serverless=target_env.get('enable_opensearch_serverless', False), @@ -741,7 +774,7 @@ def set_cloudfront_stage(self, target_env): f'export internet_facing={target_env.get("internet_facing", True)}', f'export custom_domain={str(True) if target_env.get("custom_domain") else str(False)}', f'export deployment_region={target_env.get("region", self.region)}', - f'export enable_cw_rum={target_env.get("enable_cw_rum", False)}', + f'export enable_cw_rum={target_env.get("enable_cw_rum", False) and target_env.get("custom_auth", None) == None }', f'export resource_prefix={self.resource_prefix}', f'export reauth_ttl={str(target_env.get("reauth_config", {}).get("ttl", 5))}', f'export custom_auth_provider={str(target_env.get("custom_auth", {}).get("provider", "None"))}', @@ -781,7 +814,7 @@ def set_cloudfront_stage(self, target_env): *front_stage_actions, self.cognito_config_action(target_env), ) - if target_env.get('enable_cw_rum', False): + if target_env.get('enable_cw_rum', False) and target_env.get("custom_auth", None) == None: front_stage_actions = ( *front_stage_actions, self.cw_rum_config_action(target_env), @@ -885,6 +918,7 @@ def set_albfront_stage(self, target_env, repository_name): custom_domain=target_env['custom_domain'], ip_ranges=target_env.get('ip_ranges'), resource_prefix=self.resource_prefix, + custom_auth=target_env.get('custom_auth', None) ), pre=[ pipelines.CodeBuildStep( @@ -907,8 +941,18 @@ def set_albfront_stage(self, target_env, repository_name): f'export internet_facing={target_env.get("internet_facing", False)}', f'export custom_domain=True', f'export deployment_region={target_env.get("region", self.region)}', - f'export enable_cw_rum={target_env.get("enable_cw_rum", False)}', + f'export enable_cw_rum={target_env.get("enable_cw_rum", False) and target_env.get("custom_auth", None) == None}', f'export resource_prefix={self.resource_prefix}', + f'export reauth_ttl={str(target_env.get("reauth_config", {}).get("ttl", 5))}', + f'export custom_auth_provider={str(target_env.get("custom_auth", {}).get("provider", "None"))}', + f'export custom_auth_url={str(target_env.get("custom_auth", {}).get("url", "None"))}', + f'export custom_auth_redirect_url={str(target_env.get("custom_auth", {}).get("redirect_url", "None"))}', + f'export custom_auth_client_id={str(target_env.get("custom_auth", {}).get("client_id", "None"))}', + f'export custom_auth_response_types={str(target_env.get("custom_auth", {}).get("response_types", "None"))}', + f'export custom_auth_scopes={str(target_env.get("custom_auth", {}).get("scopes", "None"))}', + f'export custom_auth_claims_mapping_email={str(target_env.get("custom_auth", {}).get("claims_mapping", {}).get("email", "None"))}', + f'export custom_auth_claims_mapping_user_id={str(target_env.get("custom_auth", {}).get("claims_mapping", {}).get("user_id", "None"))}', + ## Ask can we make the .aws file with a permission of 400 'mkdir ~/.aws/ && touch ~/.aws/config', 'echo "[profile buildprofile]" > ~/.aws/config', f'echo "role_arn = arn:aws:iam::{target_env["account"]}:role/{self.resource_prefix}-{target_env["envname"]}-cognito-config-role" >> ~/.aws/config', @@ -926,39 +970,44 @@ def set_albfront_stage(self, target_env, repository_name): ], role=self.expanded_codebuild_role.without_policy_updates(), vpc=self.vpc, - ), - pipelines.CodeBuildStep( - id='UserGuideImage', - build_environment=codebuild.BuildEnvironment( - build_image=codebuild.LinuxBuildImage.AMAZON_LINUX_2_4, - compute_type=codebuild.ComputeType.LARGE, - privileged=True, - environment_variables={ - 'REPOSITORY_URI': codebuild.BuildEnvironmentVariable( - value=f'{self.account}.dkr.ecr.{self.region}.amazonaws.com/{repository_name}' - ), - 'IMAGE_TAG': codebuild.BuildEnvironmentVariable(value=f'userguide-{self.image_tag}'), - }, - ), - commands=[ - f'aws codeartifact login --tool pip --repository {self.codeartifact.codeartifact_pip_repo_name} --domain {self.codeartifact.codeartifact_domain_name} --domain-owner {self.codeartifact.domain.attr_owner}', - 'cd documentation/userguide', - 'docker build -f docker/prod/Dockerfile -t $IMAGE_TAG:$IMAGE_TAG .', - f'aws ecr get-login-password --region {self.region} | docker login --username AWS --password-stdin {self.account}.dkr.ecr.{self.region}.amazonaws.com', - 'docker tag $IMAGE_TAG:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG', - 'docker push $REPOSITORY_URI:$IMAGE_TAG', - ], - role=self.expanded_codebuild_role.without_policy_updates(), - vpc=self.vpc, - ), + ) ] ) + if target_env.get('custom_auth') is None: + albfront_stage.add_pre(self.user_guide_pre_build_alb(repository_name)) + if target_env.get('custom_auth') is None: albfront_stage.add_post(self.cognito_config_action(target_env)) - if target_env.get('enable_cw_rum', False): + if target_env.get('enable_cw_rum', False) and target_env.get("custom_auth", None) == None: albfront_stage.add_post(self.cw_rum_config_action(target_env)) + def user_guide_pre_build_alb(self, repository_name): + return pipelines.CodeBuildStep( + id='UserGuideImage', + build_environment=codebuild.BuildEnvironment( + build_image=codebuild.LinuxBuildImage.AMAZON_LINUX_2_4, + compute_type=codebuild.ComputeType.LARGE, + privileged=True, + environment_variables={ + 'REPOSITORY_URI': codebuild.BuildEnvironmentVariable( + value=f'{self.account}.dkr.ecr.{self.region}.amazonaws.com/{repository_name}' + ), + 'IMAGE_TAG': codebuild.BuildEnvironmentVariable(value=f'userguide-{self.image_tag}'), + }, + ), + commands=[ + f'aws codeartifact login --tool pip --repository {self.codeartifact.codeartifact_pip_repo_name} --domain {self.codeartifact.codeartifact_domain_name} --domain-owner {self.codeartifact.domain.attr_owner}', + 'cd documentation/userguide', + 'docker build -f docker/prod/Dockerfile -t $IMAGE_TAG:$IMAGE_TAG .', + f'aws ecr get-login-password --region {self.region} | docker login --username AWS --password-stdin {self.account}.dkr.ecr.{self.region}.amazonaws.com', + 'docker tag $IMAGE_TAG:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG', + 'docker push $REPOSITORY_URI:$IMAGE_TAG', + ], + role=self.expanded_codebuild_role.without_policy_updates(), + vpc=self.vpc, + ) + def set_release_stage( self, ): diff --git a/frontend/src/authentication/components/GuestGuard.js b/frontend/src/authentication/components/GuestGuard.js index b61ce8501..27cfa0229 100644 --- a/frontend/src/authentication/components/GuestGuard.js +++ b/frontend/src/authentication/components/GuestGuard.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; import { Navigate } from 'react-router-dom'; -import { useAuth } from '../hooks/useAuth'; +import { useAuth } from 'authentication'; export const GuestGuard = ({ children }) => { const { isAuthenticated } = useAuth(); diff --git a/frontend/src/authentication/hooks/useToken.js b/frontend/src/authentication/hooks/useToken.js index 22c51dcb5..08cfd5668 100644 --- a/frontend/src/authentication/hooks/useToken.js +++ b/frontend/src/authentication/hooks/useToken.js @@ -1,7 +1,7 @@ import { Auth } from 'aws-amplify'; import { useEffect, useState } from 'react'; import { SET_ERROR, useDispatch } from 'globalErrors'; -import { useAuth } from './useAuth'; +import { useAuth } from 'authentication'; export const useToken = () => { const dispatch = useDispatch(); diff --git a/frontend/src/design/components/popovers/AccountPopover.js b/frontend/src/design/components/popovers/AccountPopover.js index 58c5e61b3..eefacaa72 100644 --- a/frontend/src/design/components/popovers/AccountPopover.js +++ b/frontend/src/design/components/popovers/AccountPopover.js @@ -15,7 +15,7 @@ import { Link as RouterLink, useNavigate } from 'react-router-dom'; import { useGroups } from 'services'; import { CogIcon } from '../../icons'; import { TextAvatar } from '../TextAvatar'; -import { useAuth } from '../../../authentication'; +import { useAuth } from 'authentication'; export const AccountPopover = () => { const anchorRef = useRef(null); diff --git a/frontend/src/reauthentication/contexts/RequestContext.js b/frontend/src/reauthentication/contexts/RequestContext.js index fce9f44a4..6986d5db3 100644 --- a/frontend/src/reauthentication/contexts/RequestContext.js +++ b/frontend/src/reauthentication/contexts/RequestContext.js @@ -6,7 +6,7 @@ import { print } from 'graphql/language'; import { useNavigate } from 'react-router'; import { useSnackbar } from 'notistack'; import { Auth } from 'aws-amplify'; -import { useAuth, useToken } from '../../authentication'; +import { useAuth, useToken } from 'authentication'; // Create a context for API request headers const RequestContext = createContext(); diff --git a/frontend/src/authentication/services/getServiceProviderInfo.js b/frontend/src/services/graphql/Groups/getGroupsForUser.js similarity index 100% rename from frontend/src/authentication/services/getServiceProviderInfo.js rename to frontend/src/services/graphql/Groups/getGroupsForUser.js diff --git a/frontend/src/services/graphql/Groups/index.js b/frontend/src/services/graphql/Groups/index.js index 07e00aa43..f1bce30a4 100644 --- a/frontend/src/services/graphql/Groups/index.js +++ b/frontend/src/services/graphql/Groups/index.js @@ -1 +1,2 @@ export * from './listGroups'; +export * from './getGroupsForUser'; diff --git a/frontend/src/services/graphql/Groups/listCognitoGroups.js b/frontend/src/services/graphql/Groups/listCognitoGroups.js deleted file mode 100644 index a634106e4..000000000 --- a/frontend/src/services/graphql/Groups/listCognitoGroups.js +++ /dev/null @@ -1,14 +0,0 @@ -import { gql } from 'apollo-boost'; - -export const listCognitoGroups = ({ filter }) => ({ - variables: { - filter - }, - query: gql` - query listCognitoGroups($filter: CognitoGroupFilter) { - listCognitoGroups(filter: $filter) { - groupName - } - } - ` -}); diff --git a/frontend/src/services/hooks/useGroups.js b/frontend/src/services/hooks/useGroups.js index dba21b7ec..f175baa54 100644 --- a/frontend/src/services/hooks/useGroups.js +++ b/frontend/src/services/hooks/useGroups.js @@ -1,9 +1,9 @@ import { Auth } from 'aws-amplify'; import { useEffect, useState } from 'react'; import { SET_ERROR, useDispatch } from 'globalErrors'; -import { useClient } from './useClient'; -import { useAuth } from '../../authentication'; -import { getGroupsForUser } from '../../authentication/services/getServiceProviderInfo'; +import { useClient } from 'services'; +import { useAuth } from 'authentication'; +import { getGroupsForUser } from 'services'; export const useGroups = () => { const dispatch = useDispatch(); From 4cf5f7d12dec127d8389d9b03d1c81098d5ccfac Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Sun, 10 Dec 2023 19:10:12 -0600 Subject: [PATCH 11/17] Addressing review comments - Minor backend deploy changes and fixing naming conventiosn and added guardrails --- .../dataall/base/services/service_provider.py | 13 +++++++++ .../base/services/service_provider_factory.py | 2 +- backend/dataall/core/groups/api/resolvers.py | 2 +- .../custom_authorizer_lambda.py | 4 ++- deploy/stacks/albfront_stack.py | 27 ++++++++++--------- tests/core/groups/test_group.py | 15 ++++++----- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/backend/dataall/base/services/service_provider.py b/backend/dataall/base/services/service_provider.py index 5c2ad9b80..be45f44f3 100644 --- a/backend/dataall/base/services/service_provider.py +++ b/backend/dataall/base/services/service_provider.py @@ -3,14 +3,27 @@ class ServiceProvider: + """ + Abstract function to fetch emailds for group + groupName: str - Group / Team name present in the user pool service provider + """ @abc.abstractmethod def get_user_emailids_from_group(self, groupName): raise NotImplementedError + """ + Abstract function to fetch groups belonging to a user + user_id: str - user id information needed by the user pool service provider to fetch groups + """ @abc.abstractmethod def get_groups_for_user(self, user_id): raise NotImplementedError + """ + Abstract function to list groups + envname: str - Deployment environment name as specified in the cdk.json + region: str - Region which is configured in the cdk.json + """ @abc.abstractmethod def list_groups(self, envname: str, region: str): raise NotImplementedError diff --git a/backend/dataall/base/services/service_provider_factory.py b/backend/dataall/base/services/service_provider_factory.py index 040f1ec52..95c7cb4ff 100644 --- a/backend/dataall/base/services/service_provider_factory.py +++ b/backend/dataall/base/services/service_provider_factory.py @@ -10,6 +10,6 @@ def get_service_provider_instance(): if (os.environ.get("custom_auth", None)): # Return instance of your service provider which implements the ServiceProvider interface # Please take a look at the "Deploy to AWS" , External IDP section for steps - return None + raise Exception('Service Provider not implemented when using custom auth configuration. Please implement and the again deploy backend stack') else: return Cognito() diff --git a/backend/dataall/core/groups/api/resolvers.py b/backend/dataall/core/groups/api/resolvers.py index d62de2b27..1f08daeea 100644 --- a/backend/dataall/core/groups/api/resolvers.py +++ b/backend/dataall/core/groups/api/resolvers.py @@ -76,7 +76,7 @@ def list_groups(context, source, filter: dict = None): def get_groups_for_user(context, source, userid): envname = os.getenv('envname', 'local') - if envname in ['dkrcompose']: + if envname in ['local', 'dkrcompose']: return [{"groupName": 'Engineers'}, {"groupName": 'Scientists'}, {"groupName": 'Requesters'}, {"groupName": 'Producers'}, {"groupName": 'Consumers'}] service_provider = ServiceProviderFactory.get_service_provider_instance() diff --git a/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py index c1c2f1b5b..f7da76f23 100644 --- a/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py +++ b/deploy/custom_resources/custom_authorizer/custom_authorizer_lambda.py @@ -39,9 +39,11 @@ def lambda_handler(incoming_event, context): if __name__ == '__main__': # for testing locally you can enter the JWT ID Token here token = "" + account_id = "" + api_gw_id = "" event = { "type": "TOKEN", "Authorization": token, - "methodArn": "arn:aws:execute-api:us-east-1:012356677990:abc1cv8nko/prod/POST/graphql/api" + "methodArn": f"arn:aws:execute-api:us-east-1:{account_id}:{api_gw_id}/prod/POST/graphql/api" } lambda_handler(event, None) \ No newline at end of file diff --git a/deploy/stacks/albfront_stack.py b/deploy/stacks/albfront_stack.py index cebd7f46d..2f5c1e61f 100644 --- a/deploy/stacks/albfront_stack.py +++ b/deploy/stacks/albfront_stack.py @@ -282,6 +282,20 @@ def __init__( ) self.allow_alb_access(userguide_alb, ip_ranges, vpc) + CfnOutput( + self, + f'UserGuideService{envname}Arn', + export_name=f'userguide-{envname}-arn', + value=userguide_alb.load_balancer.load_balancer_arn, + ) + + CfnOutput( + self, + f'UserGuideService{envname}HostedZoneId', + export_name=f'userguide-{envname}-hostedzoneid', + value=userguide_alb.load_balancer.load_balancer_canonical_hosted_zone_id, + ) + CfnOutput( self, f'FrontEndService{envname}Arn', @@ -296,19 +310,6 @@ def __init__( value=frontend_alb.load_balancer.load_balancer_canonical_hosted_zone_id, ) - CfnOutput( - self, - f'UserGuideService{envname}Arn', - export_name=f'userguide-{envname}-arn', - value=userguide_alb.load_balancer.load_balancer_arn, - ) - - CfnOutput( - self, - f'UserGuideService{envname}HostedZoneId', - export_name=f'userguide-{envname}-hostedzoneid', - value=userguide_alb.load_balancer.load_balancer_canonical_hosted_zone_id, - ) def create_log_group(self, envname, resource_prefix, log_group_name): log_group = logs.LogGroup( diff --git a/tests/core/groups/test_group.py b/tests/core/groups/test_group.py index dd4df1537..653200fd5 100644 --- a/tests/core/groups/test_group.py +++ b/tests/core/groups/test_group.py @@ -1,16 +1,19 @@ from unittest.mock import MagicMock - -def test_list_groups_env(client, env_fixture, group, module_mocker): - mock_client = MagicMock() +def mock_cognito_client(module_mocker): + mock_cognito_client = MagicMock() module_mocker.patch( 'dataall.base.aws.cognito.Cognito', - return_value=mock_client + return_value=mock_cognito_client ) - mock_client().list_groups.return_value = ['cognitos', 'testadmins'] + mock_cognito_client().list_groups.return_value = ['cognitos', 'testadmins'] + return mock_cognito_client + +def test_list_groups_env(client, env_fixture, group, module_mocker): + cognito_client = mock_cognito_client(module_mocker) module_mocker.patch( 'dataall.core.groups.api.resolvers.ServiceProviderFactory.get_service_provider_instance', - return_value=mock_client() + return_value=cognito_client() ) response = client.query( """ From bea1836d54ffed732a222362745ebb3514e44aa1 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Mon, 11 Dec 2023 14:32:27 -0600 Subject: [PATCH 12/17] user id check from context in resolver function. Fixed tests --- backend/api_handler.py | 10 ++++++++-- backend/dataall/base/context.py | 1 + backend/dataall/core/groups/api/resolvers.py | 2 ++ tests/client.py | 5 +++-- tests/modules/datasets/test_dataset_permissions.py | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/api_handler.py b/backend/api_handler.py index cbc5877ea..5092184be 100644 --- a/backend/api_handler.py +++ b/backend/api_handler.py @@ -129,11 +129,16 @@ def handler(event, context): else: claims = event['requestContext']['authorizer']['claims'] username = claims['email'] + # Defaulting user_id field to contain email + # When "authorizer" in the event contains the user_id field override with that value + # user_id is used when deploying data.all with custom_auth + user_id = claims['email'] + if 'user_id' in event['requestContext']['authorizer']: + user_id = event['requestContext']['authorizer']['user_id'] log.debug('username is %s', username) try: groups = [] if (os.environ.get('custom_auth', None)): - user_id = event['requestContext']['authorizer']['user_id'] groups.extend(get_custom_groups(user_id)) else: groups.extend(get_cognito_groups(claims)) @@ -158,13 +163,14 @@ def handler(event, context): print(f'Error managing groups due to: {e}') groups = [] - set_context(RequestContext(ENGINE, username, groups)) + set_context(RequestContext(ENGINE, username, groups, user_id)) app_context = { 'engine': ENGINE, 'username': username, 'groups': groups, 'schema': SCHEMA, + 'user_id': user_id } # Determine if there are any Operations that Require ReAuth From SSM Parameter diff --git a/backend/dataall/base/context.py b/backend/dataall/base/context.py index 50434ed3f..9d9726cd6 100644 --- a/backend/dataall/base/context.py +++ b/backend/dataall/base/context.py @@ -23,6 +23,7 @@ class RequestContext: db_engine: Engine username: str groups: List[str] + user_id: str def get_context() -> RequestContext: diff --git a/backend/dataall/core/groups/api/resolvers.py b/backend/dataall/core/groups/api/resolvers.py index 1f08daeea..3a4667ecd 100644 --- a/backend/dataall/core/groups/api/resolvers.py +++ b/backend/dataall/core/groups/api/resolvers.py @@ -75,6 +75,8 @@ def list_groups(context, source, filter: dict = None): def get_groups_for_user(context, source, userid): + if context.user_id != userid: + raise Exception("User Id doesn't match user id from context") envname = os.getenv('envname', 'local') if envname in ['local', 'dkrcompose']: return [{"groupName": 'Engineers'}, {"groupName": 'Scientists'}, {"groupName": 'Requesters'}, diff --git a/tests/client.py b/tests/client.py index e6aba0f0c..3126b14e0 100644 --- a/tests/client.py +++ b/tests/client.py @@ -58,10 +58,10 @@ def graphql_server(): data = request.get_json() username = request.headers.get('Username', 'anonym') - emailId = request.headers.get('Username', 'email@email.com') + user_id = request.headers.get('Username', 'anonym_id') groups = json.loads(request.headers.get('Groups', '[]')) - set_context(RequestContext(db, username, groups)) + set_context(RequestContext(db, username, groups, user_id)) success, result = graphql_sync( schema, @@ -71,6 +71,7 @@ def graphql_server(): 'engine': db, 'username': username, 'groups': groups, + 'user_id': user_id }, debug=app.debug, ) diff --git a/tests/modules/datasets/test_dataset_permissions.py b/tests/modules/datasets/test_dataset_permissions.py index cb8febb63..4a7e4c15c 100644 --- a/tests/modules/datasets/test_dataset_permissions.py +++ b/tests/modules/datasets/test_dataset_permissions.py @@ -68,7 +68,7 @@ def test_unauthorized_resource_policy( def test_create_dataset(db, user, group, dataset_fixture, permissions, tenant): with db.scoped_session() as session: - set_context(RequestContext(db, user.username, [group.name])) + set_context(RequestContext(db, user.username, [group.name], user_id=user.username)) TenantPolicy.attach_group_tenant_policy( session=session, From 92cf30c19ba247b6ec5dfffc4323849deee04980 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Tue, 12 Dec 2023 09:11:23 -0600 Subject: [PATCH 13/17] Added Guardrails for user id and few frontend linter fixes --- backend/api_handler.py | 1 - backend/dataall/core/groups/api/resolvers.py | 4 +++- backend/local_graphql_server.py | 3 ++- frontend/src/services/hooks/useGroups.js | 3 +-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/api_handler.py b/backend/api_handler.py index 5092184be..b94c7d497 100644 --- a/backend/api_handler.py +++ b/backend/api_handler.py @@ -170,7 +170,6 @@ def handler(event, context): 'username': username, 'groups': groups, 'schema': SCHEMA, - 'user_id': user_id } # Determine if there are any Operations that Require ReAuth From SSM Parameter diff --git a/backend/dataall/core/groups/api/resolvers.py b/backend/dataall/core/groups/api/resolvers.py index 3a4667ecd..ac1c8f7f0 100644 --- a/backend/dataall/core/groups/api/resolvers.py +++ b/backend/dataall/core/groups/api/resolvers.py @@ -1,6 +1,7 @@ import os import logging +from dataall.base.context import get_context from dataall.base.services.service_provider_factory import ServiceProviderFactory from dataall.core.groups.db.group_models import Group from dataall.core.environment.services.environment_service import EnvironmentService @@ -75,7 +76,8 @@ def list_groups(context, source, filter: dict = None): def get_groups_for_user(context, source, userid): - if context.user_id != userid: + request_context = get_context() + if request_context.user_id != userid: raise Exception("User Id doesn't match user id from context") envname = os.getenv('envname', 'local') if envname in ['local', 'dkrcompose']: diff --git a/backend/local_graphql_server.py b/backend/local_graphql_server.py index 13f41297a..338c603eb 100644 --- a/backend/local_graphql_server.py +++ b/backend/local_graphql_server.py @@ -87,7 +87,7 @@ def request_context(headers, mock=False): tenant_name='dataall', ) - set_context(RequestContext(db_engine=engine, username=username, groups=groups)) + set_context(RequestContext(db_engine=engine, username=username, groups=groups, user_id=username)) # TODO: remove when the migration to a new RequestContext API is complete. Used only for backward compatibility context = Context( @@ -95,6 +95,7 @@ def request_context(headers, mock=False): schema=schema, username=username, groups=groups, + user_id=username ) return context.__dict__ diff --git a/frontend/src/services/hooks/useGroups.js b/frontend/src/services/hooks/useGroups.js index f175baa54..87d7919ed 100644 --- a/frontend/src/services/hooks/useGroups.js +++ b/frontend/src/services/hooks/useGroups.js @@ -1,9 +1,8 @@ import { Auth } from 'aws-amplify'; import { useEffect, useState } from 'react'; import { SET_ERROR, useDispatch } from 'globalErrors'; -import { useClient } from 'services'; +import { useClient, getGroupsForUser } from 'services'; import { useAuth } from 'authentication'; -import { getGroupsForUser } from 'services'; export const useGroups = () => { const dispatch = useDispatch(); From 09a9a067ee6ef73f5ab7cb2e06849a67166fa457 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Tue, 12 Dec 2023 09:45:01 -0600 Subject: [PATCH 14/17] Adding Policy for frontend deployment --- deploy/stacks/albfront_stack.py | 23 +++++++++++++++++++++++ deploy/stacks/albfront_stage.py | 2 ++ deploy/stacks/pipeline.py | 3 ++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/deploy/stacks/albfront_stack.py b/deploy/stacks/albfront_stack.py index 2f5c1e61f..f0e5a778e 100644 --- a/deploy/stacks/albfront_stack.py +++ b/deploy/stacks/albfront_stack.py @@ -28,6 +28,7 @@ def __init__( image_tag=None, custom_domain=None, ip_ranges=None, + tooling_account_id=None, custom_auth=None, **kwargs, ): @@ -36,6 +37,28 @@ def __init__( if self.node.try_get_context('image_tag'): image_tag = self.node.try_get_context('image_tag') + cross_account_front_end_deployment_role = iam.Role( + self, + f'{resource_prefix}-{envname}-front_end_deployment_role', + role_name=f'{resource_prefix}-{envname}-front_end_deployment_role', + assumed_by=iam.AccountPrincipal(tooling_account_id), + ) + + cross_account_front_end_deployment_role.add_to_policy( + iam.PolicyStatement( + actions=[ + 'ssm:GetParameterHistory', + 'ssm:GetParameters', + 'ssm:GetParameter', + 'ssm:GetParametersByPath' + ], + resources=[ + f'arn:aws:ssm:*:{self.account}:parameter/*{resource_prefix}*', + f'arn:aws:ssm:*:{self.account}:parameter/*dataall*' + ], + ), + ) + frontend_image_tag = f'frontend-{image_tag}' userguide_image_tag = f'userguide-{image_tag}' diff --git a/deploy/stacks/albfront_stage.py b/deploy/stacks/albfront_stage.py index 6c84f4a21..53b39564c 100644 --- a/deploy/stacks/albfront_stage.py +++ b/deploy/stacks/albfront_stage.py @@ -16,6 +16,7 @@ def __init__( image_tag=None, custom_domain=None, ip_ranges=None, + tooling_account_id=None, custom_auth=None, **kwargs, ): @@ -30,6 +31,7 @@ def __init__( image_tag=image_tag, custom_domain=custom_domain, ip_ranges=ip_ranges, + tooling_account_id=tooling_account_id, custom_auth=custom_auth ) diff --git a/deploy/stacks/pipeline.py b/deploy/stacks/pipeline.py index ca67514b6..e18c8bb39 100644 --- a/deploy/stacks/pipeline.py +++ b/deploy/stacks/pipeline.py @@ -919,6 +919,7 @@ def set_albfront_stage(self, target_env, repository_name): custom_domain=target_env['custom_domain'], ip_ranges=target_env.get('ip_ranges'), resource_prefix=self.resource_prefix, + tooling_account_id=self.account, custom_auth=target_env.get('custom_auth', None) ), pre=[ @@ -955,7 +956,7 @@ def set_albfront_stage(self, target_env, repository_name): f'export custom_auth_claims_mapping_user_id={str(target_env.get("custom_auth", {}).get("claims_mapping", {}).get("user_id", "None"))}', 'mkdir ~/.aws/ && touch ~/.aws/config', 'echo "[profile buildprofile]" > ~/.aws/config', - f'echo "role_arn = arn:aws:iam::{target_env["account"]}:role/{self.resource_prefix}-{target_env["envname"]}-cognito-config-role" >> ~/.aws/config', + f'echo "role_arn = arn:aws:iam::{target_env["account"]}:role/{self.resource_prefix}-{target_env["envname"]}-front_end_deployment_role" >> ~/.aws/config', 'echo "credential_source = EcsContainer" >> ~/.aws/config', 'aws sts get-caller-identity --profile buildprofile', 'export AWS_PROFILE=buildprofile', From da2beb06e8d189b41ff067bb95adb4015f01e0c3 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 5 Jan 2024 16:15:29 -0600 Subject: [PATCH 15/17] Fix for environments update with auto create pivot role - GH Issue -943 --- .../cdk/env_role_dataset_s3_policy.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py b/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py index b59843cd1..cb98948f6 100644 --- a/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py +++ b/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py @@ -70,18 +70,16 @@ def _generate_dataset_statements(datasets: List[Dataset]): @staticmethod def _set_allowed_kms_keys_statements(datasets): - allowed_buckets_kms_keys = [] + imported_kms_alias = [] + # Datasets belonging to a team and an environment are present in same region and aws account + imported_dataset_resources = [f"arn:aws:kms:{datasets[0].region}:{datasets[0].AwsAccountId}:key/*"] if datasets: dataset: Dataset for dataset in datasets: if dataset.imported and dataset.importedKmsKey: - key_id = KmsClient(account_id=dataset.AwsAccountId, region=dataset.region).get_key_id( - key_alias=f"alias/{dataset.KmsAlias}" - ) - if key_id: - allowed_buckets_kms_keys.append( - f"arn:aws:kms:{dataset.region}:{dataset.AwsAccountId}:key/{key_id}") - if len(allowed_buckets_kms_keys): + imported_kms_alias.append(f'alias/{dataset.KmsAlias}') + + if len(imported_kms_alias): return iam.PolicyStatement( sid="KMSImportedDatasetAccess", actions=[ @@ -92,6 +90,11 @@ def _set_allowed_kms_keys_statements(datasets): "kms:GenerateDataKey" ], effect=iam.Effect.ALLOW, - resources=allowed_buckets_kms_keys + resources=imported_dataset_resources, + conditions={ + 'ForAnyValue:StringLike': { + 'kms:ResourceAliases' : imported_kms_alias + } + } ) return None From d87ce99c4b5283cdd87d071d311b445b5ba7fcb1 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Fri, 5 Jan 2024 16:17:50 -0600 Subject: [PATCH 16/17] Minor Linting - GH Issue -943 --- deploy/custom_resources/custom_authorizer/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/custom_resources/custom_authorizer/requirements.txt b/deploy/custom_resources/custom_authorizer/requirements.txt index 61c8256b0..5c63b942b 100644 --- a/deploy/custom_resources/custom_authorizer/requirements.txt +++ b/deploy/custom_resources/custom_authorizer/requirements.txt @@ -7,4 +7,4 @@ python-jose==3.3.0 requests==2.31.0 rsa==4.9 six==1.16.0 -urllib3==1.26.18 +urllib3==1.26.18 \ No newline at end of file From dfb21f3c2d4997336b8c2b9d2895b64b17425453 Mon Sep 17 00:00:00 2001 From: Tejas Rajopadhye Date: Mon, 8 Jan 2024 09:29:17 -0600 Subject: [PATCH 17/17] Displaced imported_dataset_resources after checking datasets - GH Issue -943 --- .../modules/datasets/cdk/env_role_dataset_s3_policy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py b/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py index cb98948f6..8b0b43152 100644 --- a/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py +++ b/backend/dataall/modules/datasets/cdk/env_role_dataset_s3_policy.py @@ -71,9 +71,9 @@ def _generate_dataset_statements(datasets: List[Dataset]): @staticmethod def _set_allowed_kms_keys_statements(datasets): imported_kms_alias = [] - # Datasets belonging to a team and an environment are present in same region and aws account - imported_dataset_resources = [f"arn:aws:kms:{datasets[0].region}:{datasets[0].AwsAccountId}:key/*"] if datasets: + # Datasets belonging to a team and an environment are present in same region and aws account + imported_dataset_resources = [f"arn:aws:kms:{datasets[0].region}:{datasets[0].AwsAccountId}:key/*"] dataset: Dataset for dataset in datasets: if dataset.imported and dataset.importedKmsKey: