From b2b30bc876474c5ed0121ecfa36a30a9cfd7988a Mon Sep 17 00:00:00 2001 From: VineetBala-AOT <90332175+VineetBala-AOT@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:25:28 -0800 Subject: [PATCH] Updating met repo with all changes on epic engage (#2348) * Changes to show all survey results to superusers * removing hard coded values * fixing linting * splitting to seperate end points * Handle no data error for graphs * adding new nodata component * adding new email for submission response * fixing linting and testing * Upgrades to Issue Tracking Table * removing try catch * removing changes for email verification * updating * Merging bug fixes from epic engage * Updating comment service to remove metadata * fixing met-api linting * Updating change log * Updating comment * fixing linting for analytics --- CHANGELOG.MD | 9 + ...15a_updating_available_response_options.py | 30 ++ ...9e8ff_adding_available_response_options.py | 41 ++ analytics-api/src/analytics_api/config.py | 13 +- .../models/available_response_option.py | 12 + .../models/request_type_option.py | 61 ++- met-api/sample.env | 1 + met-api/src/met_api/__init__.py | 3 +- met-api/src/met_api/config.py | 103 ++-- .../proponent_comments_sheet.xlsx | Bin 7993 -> 19077 bytes met-api/src/met_api/models/comment.py | 2 +- met-api/src/met_api/models/engagement.py | 13 +- .../src/met_api/models/engagement_metadata.py | 2 +- .../met_api/models/new_engagement_metadata.py | 24 +- .../src/met_api/services/cdogs_api_service.py | 11 +- .../src/met_api/services/comment_service.py | 69 ++- .../services/document_generation_service.py | 2 +- .../services/email_verification_service.py | 10 +- .../met_api/services/engagement_service.py | 3 +- met-api/src/met_api/services/keycloak.py | 4 +- .../services/object_storage_service.py | 26 +- .../services/slug_generation_service.py | 1 + .../met_api/services/submission_service.py | 21 +- .../src/met_api/services/survey_service.py | 2 +- met-api/src/met_api/utils/constants.py | 6 +- met-api/src/met_api/utils/tenant_validator.py | 1 - met-api/src/met_api/utils/user_context.py | 2 +- met-api/src/met_api/utils/util.py | 4 +- .../email_rejected_comment_closed.html | 30 ++ .../services/ops/submission_etl_service.py | 2 +- .../services/ops/survey_etl_service.py | 182 +++++-- met-web/package-lock.json | 454 ++++++++++-------- met-web/package.json | 2 +- .../apiManager/httpRequestHandler/index.ts | 33 +- .../review/emailPreview/EmailPreview.tsx | 40 +- .../comments/admin/textListing/index.tsx | 2 +- .../dashboard/comment/CommentTable.tsx | 59 ++- .../dashboard/comment/CommentViewContext.tsx | 16 +- .../publicDashboard/KPI/SurveyEmailsSent.tsx | 4 +- .../publicDashboard/KPI/SurveysCompleted.tsx | 15 +- .../src/components/survey/building/index.tsx | 10 +- .../survey/listing/ActionsDropDown.tsx | 3 +- .../components/survey/report/SettingsForm.tsx | 24 +- met-web/src/services/commentService/index.tsx | 5 +- openshift/api.dc.yml | 7 +- 45 files changed, 914 insertions(+), 450 deletions(-) create mode 100644 analytics-api/migrations/versions/812b1f67015a_updating_available_response_options.py create mode 100644 analytics-api/migrations/versions/e7fdf769e8ff_adding_available_response_options.py create mode 100644 analytics-api/src/analytics_api/models/available_response_option.py create mode 100644 met-api/templates/email_rejected_comment_closed.html diff --git a/CHANGELOG.MD b/CHANGELOG.MD index e12ec525a..883380381 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -6,6 +6,15 @@ All notable changes to this project will be documented in this file. This projec > **Feature**: Added the timeline widget. [🎟️DESENG-439](https://apps.itsm.gov.bc.ca/jira/browse/DESENG-439) +## January 9, 2024 + +- **Task** Improvements from Epic [🎟️DESENG-468](https://apps.itsm.gov.bc.ca/jira/browse/DESENG-468) + - Improvements to Survey Result Tracking analytics + - New Rejection Email Template for Closed Engagements + - Export Format for Proponent updated to be in excel format + - Formio Version Update + - Enable Survey Editing for Open Engagements + ## December 11, 2023 - **Task** Merge `gdx-sso`, `gdx-dev`, `gdx-main` into `main` [🎟️DESENG-442](https://apps.itsm.gov.bc.ca/jira/browse/DESENG-442) diff --git a/analytics-api/migrations/versions/812b1f67015a_updating_available_response_options.py b/analytics-api/migrations/versions/812b1f67015a_updating_available_response_options.py new file mode 100644 index 000000000..faded1962 --- /dev/null +++ b/analytics-api/migrations/versions/812b1f67015a_updating_available_response_options.py @@ -0,0 +1,30 @@ +"""updating_available_response_options + +Revision ID: 812b1f67015a +Revises: e7fdf769e8ff +Create Date: 2023-11-30 09:50:55.874798 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '812b1f67015a' +down_revision = 'e7fdf769e8ff' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('available_response_option', 'request_key', type_=sa.Text()) + op.alter_column('available_response_option', 'request_id', type_=sa.Text()) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('available_response_option', 'request_key', type_=sa.String(length=100)) + op.alter_column('available_response_option', 'request_id', type_=sa.String(length=20)) + # ### end Alembic commands ### diff --git a/analytics-api/migrations/versions/e7fdf769e8ff_adding_available_response_options.py b/analytics-api/migrations/versions/e7fdf769e8ff_adding_available_response_options.py new file mode 100644 index 000000000..679276848 --- /dev/null +++ b/analytics-api/migrations/versions/e7fdf769e8ff_adding_available_response_options.py @@ -0,0 +1,41 @@ +"""adding_available_response_options + +Revision ID: e7fdf769e8ff +Revises: 3a705c422892 +Create Date: 2023-11-21 12:45:34.871602 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e7fdf769e8ff' +down_revision = '3a705c422892' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('available_response_option', + sa.Column('created_date', sa.DateTime(), nullable=True), + sa.Column('updated_date', sa.DateTime(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=True), + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('participant_id', sa.Integer(), nullable=True), + sa.Column('request_key', sa.String(length=100), nullable=False), + sa.Column('value', sa.Text(), nullable=True), + sa.Column('request_id', sa.String(length=20), nullable=True), + sa.Column('survey_id', sa.Integer(), nullable=False), + sa.Column('runcycle_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['survey_id'], ['survey.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', 'request_key') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('available_response_option') + # ### end Alembic commands ### diff --git a/analytics-api/src/analytics_api/config.py b/analytics-api/src/analytics_api/config.py index 269b4a411..ba931c0a1 100644 --- a/analytics-api/src/analytics_api/config.py +++ b/analytics-api/src/analytics_api/config.py @@ -22,13 +22,14 @@ import os import sys +from typing import Union from dotenv import find_dotenv, load_dotenv # this will load all the envars from a .env file located in the project root (api) load_dotenv(find_dotenv()) -def get_named_config(environment: 'str | None') -> '_Config': +def get_named_config(environment: Union[str, None]) -> '_Config': """ Retrieve a configuration object by name. Used by the Flask app factory. @@ -38,16 +39,16 @@ def get_named_config(environment: 'str | None') -> '_Config': """ config_mapping = { 'development': DevConfig, - 'default': ProdConfig, - 'staging': ProdConfig, + 'default': ProdConfig, + 'staging': ProdConfig, 'production': ProdConfig, - 'testing': TestConfig, + 'testing': TestConfig, } try: print(f'Loading configuration: {environment}...') return config_mapping[environment]() - except KeyError: - raise KeyError(f'Configuration "{environment}" not found.') + except KeyError as e: + raise KeyError(f'Configuration "{environment}" not found.') from e class _Config(): # pylint: disable=too-few-public-methods diff --git a/analytics-api/src/analytics_api/models/available_response_option.py b/analytics-api/src/analytics_api/models/available_response_option.py new file mode 100644 index 000000000..0e406a4ed --- /dev/null +++ b/analytics-api/src/analytics_api/models/available_response_option.py @@ -0,0 +1,12 @@ +"""available_response_option model class. + +Manages the Available Options for a option type questions on a survey +""" +from .base_model import BaseModel +from .response_mixin import ResponseMixin + + +class AvailableResponseOption(BaseModel, ResponseMixin): # pylint: disable=too-few-public-methods + """Definition of the Available Response Options entity.""" + + __tablename__ = 'available_response_option' diff --git a/analytics-api/src/analytics_api/models/request_type_option.py b/analytics-api/src/analytics_api/models/request_type_option.py index 4c48e0394..499291d11 100644 --- a/analytics-api/src/analytics_api/models/request_type_option.py +++ b/analytics-api/src/analytics_api/models/request_type_option.py @@ -4,6 +4,7 @@ """ from sqlalchemy import and_, func, or_ from sqlalchemy.sql.expression import true +from analytics_api.models.available_response_option import AvailableResponseOption as AvailableResponseOptionModel from analytics_api.models.survey import Survey as SurveyModel from analytics_api.models.response_type_option import ResponseTypeOption as ResponseTypeOptionModel from .base_model import BaseModel @@ -34,7 +35,7 @@ def get_survey_result( if can_view_all_survey_results: survey_question = (db.session.query(RequestTypeOption.position.label('position'), RequestTypeOption.label.label('label'), - RequestTypeOption.request_id) + RequestTypeOption.key) .filter(and_(RequestTypeOption.survey_id.in_(analytics_survey_id), RequestTypeOption.is_active == true())) .order_by(RequestTypeOption.position) @@ -42,7 +43,7 @@ def get_survey_result( else: survey_question = (db.session.query(RequestTypeOption.position.label('position'), RequestTypeOption.label.label('label'), - RequestTypeOption.request_id) + RequestTypeOption.key) .filter(and_(RequestTypeOption.survey_id.in_(analytics_survey_id), RequestTypeOption.is_active == true(), or_(RequestTypeOption.display == true(), @@ -50,26 +51,60 @@ def get_survey_result( .order_by(RequestTypeOption.position) .subquery()) + # Get all the available responses for each question within the survey. + available_response = (db.session.query(AvailableResponseOptionModel.request_key, + AvailableResponseOptionModel.value) + .filter(and_(AvailableResponseOptionModel.survey_id.in_( + analytics_survey_id), AvailableResponseOptionModel.is_active == true())) + .subquery()) # Get all the survey responses with the counts for each response specific to a survey id which # are in active status. - survey_response = (db.session.query(ResponseTypeOptionModel.request_id, ResponseTypeOptionModel.value, - func.count(ResponseTypeOptionModel.request_id).label('response')) + survey_response = (db.session.query(ResponseTypeOptionModel.request_key, ResponseTypeOptionModel.value, + func.count(ResponseTypeOptionModel.request_key).label('response')) .filter(and_(ResponseTypeOptionModel.survey_id.in_(analytics_survey_id), ResponseTypeOptionModel.is_active == true())) - .group_by(ResponseTypeOptionModel.request_id, ResponseTypeOptionModel.value) + .group_by(ResponseTypeOptionModel.request_key, ResponseTypeOptionModel.value) .subquery()) + survey_response_exists = db.session.query(survey_response.c.request_key).first() + available_response_exists = db.session.query(available_response.c.request_key).first() + # Combine the data fetched above such that the result has a format as below # - position: is a unique value for each question which helps to get the order of question on the survey # - label: is the the survey question # - value: user selected response for each question # - count: number of time the same value is selected as a response to each question - survey_result = (db.session.query((survey_question.c.position).label('position'), - (survey_question.c.label).label('question'), - func.json_agg(func.json_build_object('value', survey_response.c.value, - 'count', survey_response.c.response)) - .label('result')) - .join(survey_response, survey_response.c.request_id == survey_question.c.request_id) - .group_by(survey_question.c.position, survey_question.c.label)) - return survey_result.all() + # Check if there are records in survey_response and available_response before executing the final query + # which fetches all the available responses along with the corresponding responses. + if survey_response_exists and available_response_exists: + survey_result = (db.session.query((survey_question.c.position).label('position'), + (survey_question.c.label).label('question'), + func.json_agg(func.json_build_object( + 'value', available_response.c.value, + 'count', func.coalesce(survey_response.c.response, 0))) + .label('result')) + .outerjoin(available_response, survey_question.c.key == available_response.c.request_key) + .outerjoin(survey_response, + (available_response.c.value == survey_response.c.value) & + (available_response.c.request_key == survey_response.c.request_key), + full=True) + .group_by(survey_question.c.position, survey_question.c.label)) + + return survey_result.all() + # Check if there are records in survey_response before executing the final query which fetches reponses + # even if the available_response table is not yet populated. + if survey_response_exists: + survey_result = (db.session.query((survey_question.c.position).label('position'), + (survey_question.c.label).label('question'), + func.json_agg(func.json_build_object('value', + survey_response.c.value, + 'count', + survey_response.c.response)) + .label('result')) + .join(survey_response, survey_response.c.request_key == survey_question.c.key) + .group_by(survey_question.c.position, survey_question.c.label)) + + return survey_result.all() + + return None # Return None indicating no records diff --git a/met-api/sample.env b/met-api/sample.env index 15e938527..90a2b1d60 100644 --- a/met-api/sample.env +++ b/met-api/sample.env @@ -80,6 +80,7 @@ EMAIL_FROM_ADDRESS="met-example@gov.bc.ca" SUBSCRIBE_EMAIL_TEMPLATE_ID= SUBSCRIBE_EMAIL_SUBJECT= REJECTED_EMAIL_TEMPLATE_ID= +CLOSED_ENGAGEMENT_REJECTED_EMAIL_TEMPLATE_ID= REJECTED_EMAIL_SUBJECT= VERIFICATION_EMAIL_TEMPLATE_ID= VERIFICATION_EMAIL_SUBJECT= diff --git a/met-api/src/met_api/__init__.py b/met-api/src/met_api/__init__.py index d672b4bc2..2858d08dd 100644 --- a/met-api/src/met_api/__init__.py +++ b/met-api/src/met_api/__init__.py @@ -130,12 +130,13 @@ def setup_jwt_manager(app_context, jwt_manager): def get_roles(token_info): """ Consumes a token_info dictionary and returns a list of roles. + Uses a configurable path to the roles in the token_info dictionary. """ role_access_path = app_context.config['JWT_CONFIG']['ROLE_CLAIM'] for key in role_access_path.split('.'): token_info = token_info.get(key, {}) return token_info - + app_context.config['JWT_ROLE_CALLBACK'] = get_roles jwt_manager.init_app(app_context) diff --git a/met-api/src/met_api/config.py b/met-api/src/met_api/config.py index b022ca549..9b0b76216 100644 --- a/met-api/src/met_api/config.py +++ b/met-api/src/met_api/config.py @@ -24,6 +24,7 @@ import os +from typing import Union from dotenv import find_dotenv, load_dotenv from met_api.utils.constants import TestKeyConfig @@ -36,7 +37,7 @@ os.environ = {k: v for k, v in os.environ.items() if v} -def get_named_config(environment: 'str | None') -> 'Config': +def get_named_config(environment: Union[str, None]) -> 'Config': """ Retrieve a configuration object by name. Used by the Flask app factory. @@ -46,40 +47,46 @@ def get_named_config(environment: 'str | None') -> 'Config': """ config_mapping = { 'development': DevConfig, - 'default': ProdConfig, - 'staging': ProdConfig, + 'default': ProdConfig, + 'staging': ProdConfig, 'production': ProdConfig, - 'testing': TestConfig, - 'docker': DockerConfig, + 'testing': TestConfig, + 'docker': DockerConfig, } try: print(f'Loading configuration: {environment}...') - return config_mapping[environment]() - except KeyError: - raise KeyError(f'Configuration "{environment}" not found.') + return config_mapping.get(environment, ProdConfig)() + except KeyError as e: + raise KeyError(f'Configuration "{environment}" not found.') from e + def env_truthy(env_var, default: bool = False): """ Return True if the environment variable is set to a truthy value. + Accepts a default value, which is returned if the environment variable is not set. """ return is_truthy(os.getenv(env_var, str(default))) + class Config: # pylint: disable=too-few-public-methods """ - Base configuration that sets reasonable defaults for all other configs. + Base configuration that sets reasonable defaults for all other configs. + New configurations should inherit from this one where possible. Reference: https://flask.palletsprojects.com/en/3.0.x/config/ """ def __init__(self) -> None: """ - Initializes the configuration object. Performs more advanced - configuration logic that is not possible in the normal class definition. + Initialize the configuration object. + + Performs more advanced configuration logic that is not possible + in the normal class definition. """ # If extending this class, call super().__init__() in your constructor. - print(f'SQLAlchemy URL: {self.SQLALCHEMY_DATABASE_URI}') + print(f'SQLAlchemy URL: {self.sqlalchemy_database_uri}') # apply configs to _Config in the format that flask_jwt_oidc expects # this flattens the JWT_CONFIG dict into individual attributes @@ -87,14 +94,16 @@ def __init__(self) -> None: setattr(self, f'JWT_OIDC_{key}', value) # Enable live reload and interactive API debugger for developers - os.environ["FLASK_DEBUG"] = str(self.USE_DEBUG) + os.environ['FLASK_DEBUG'] = str(self.USE_DEBUG) @property - def SQLALCHEMY_DATABASE_URI(self) -> str: + def sqlalchemy_database_uri(self) -> str: """ Dynamically fetch the SQLAlchemy Database URI based on the DB config. + This avoids having to redefine the URI after setting the DB access - credentials in subclasses. Can be overridden by env variables.""" + credentials in subclasses. Can be overridden by env variables. + """ return os.environ.get( 'SQLALCHEMY_DATABASE_URI', f'postgresql://' @@ -103,21 +112,20 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: f'{self.DB_CONFIG.get("NAME")}' ) - # If enabled, Exceptions are propagated up, instead of being handled # by the the app’s error handlers. Enable this for tests. TESTING = env_truthy('FLASK_TESTING', default=False) - + # If enabled, the interactive debugger will be shown for any # unhandled Exceptions, and the server will be reloaded when code changes. USE_DEBUG = env_truthy('FLASK_DEBUG', default=False) - + # SQLAlchemy settings # Echoes the SQL queries generated - useful for debugging SQLALCHEMY_ECHO = env_truthy('SQLALCHEMY_ECHO') # Disable modification tracking for performance SQLALCHEMY_TRACK_MODIFICATIONS = env_truthy('SQLALCHEMY_TRACK_MODIFICATIONS') - + # Used for session management. Randomized by default for security, but # should be set to a fixed value in production to avoid invalidating sessions. SECRET_KEY = os.getenv('SECRET_KEY', os.urandom(24)) @@ -164,7 +172,6 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: 'KEYCLOAK_CLIENT_ID': os.getenv('EPIC_KC_CLIENT_ID'), } - # Keycloak configuration KEYCLOAK_CONFIG = KC = { 'BASE_URL': os.getenv('KEYCLOAK_BASE_URL', ''), @@ -173,7 +180,7 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: 'SERVICE_ACCOUNT_SECRET': os.getenv('MET_ADMIN_CLIENT_SECRET'), 'ADMIN_USERNAME': os.getenv('MET_ADMIN_CLIENT_ID'), 'ADMIN_SECRET': os.getenv('MET_ADMIN_CLIENT_SECRET'), - 'CONNECT_TIMEOUT': int(os.getenv('KEYCLOAK_CONNECT_TIMEOUT', 60)), + 'CONNECT_TIMEOUT': int(os.getenv('KEYCLOAK_CONNECT_TIMEOUT', '60')), } # JWT OIDC Settings (for Keycloak) @@ -184,14 +191,14 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: f'{KC["BASE_URL"]}/realms/{KC["REALMNAME"]}' )), 'WELL_KNOWN_CONFIG': os.getenv( - 'JWT_OIDC_WELL_KNOWN_CONFIG', + 'JWT_OIDC_WELL_KNOWN_CONFIG', f'{_issuer}/.well-known/openid-configuration', ), 'JWKS_URI': os.getenv('JWT_OIDC_JWKS_URI', f'{_issuer}/protocol/openid-connect/certs'), 'ALGORITHMS': os.getenv('JWT_OIDC_ALGORITHMS', 'RS256'), 'AUDIENCE': os.getenv('JWT_OIDC_AUDIENCE', 'account'), - 'CACHING_ENABLED': str(env_truthy('JWT_OIDC_CACHING_ENABLED', True)), - 'JWKS_CACHE_TIMEOUT': int(os.getenv('JWT_OIDC_JWKS_CACHE_TIMEOUT', 300)), + 'CACHING_ENABLED': str(env_truthy('JWT_OIDC_CACHING_ENABLED', 'True')), + 'JWKS_CACHE_TIMEOUT': int(os.getenv('JWT_OIDC_JWKS_CACHE_TIMEOUT', '300')), 'ROLE_CLAIM': os.getenv('JWT_OIDC_ROLE_CLAIM', 'realm_access.roles'), } @@ -230,11 +237,11 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: 'UNSUBSCRIBE': os.getenv( 'UNSUBSCRIBE_PATH', '/engagements/{engagement_id}/unsubscribe/{participant_id}' ), - "ENGAGEMENT": { + 'ENGAGEMENT': { 'VIEW': os.getenv('ENGAGEMENT_PATH', '/engagements/{engagement_id}/view'), 'SLUG': os.getenv('ENGAGEMENT_PATH_SLUG', '/{slug}'), 'DASHBOARD': os.getenv( - 'ENGAGEMENT_DASHBOARD_PATH','/engagements/{engagement_id}/comments/public' + 'ENGAGEMENT_DASHBOARD_PATH', '/engagements/{engagement_id}/comments/public' ), 'DASHBOARD_SLUG': os.getenv( 'ENGAGEMENT_DASHBOARD_PATH_SLUG', '/{slug}/comments/public' @@ -252,35 +259,40 @@ def SQLALCHEMY_DATABASE_URI(self) -> str: # value in met-cron/cron/crontab 'CLOSING_TIME': os.getenv('ENGAGEMENT_END_TIME', '5 PM'), 'FROM_ADDRESS': os.getenv('EMAIL_FROM_ADDRESS'), - 'ENVIRONMENT' : os.getenv('EMAIL_ENVIRONMENT'), + 'ENVIRONMENT': os.getenv('EMAIL_ENVIRONMENT'), 'SUBSCRIBE': { 'ID': os.getenv('SUBSCRIBE_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('SUBSCRIBE_EMAIL_SUBJECT', - 'Confirm your subscription'), + 'SUBJECT': os.getenv('SUBSCRIBE_EMAIL_SUBJECT', + 'Confirm your subscription'), }, 'REJECTED': { 'ID': os.getenv('REJECTED_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('REJECTED_EMAIL_SUBJECT', - '{engagement_name} - About your Comments'), + 'SUBJECT': os.getenv('REJECTED_EMAIL_SUBJECT', + 'Your comment on {engagement_name} needs to be edited'), + }, + 'CLOSED_ENGAGEMENT_REJECTED': { + 'ID': os.getenv('CLOSED_ENGAGEMENT_REJECTED_EMAIL_TEMPLATE_ID'), + 'SUBJECT': os.getenv('CLOSED_ENGAGEMENT_REJECTED_EMAIL_SUBJECT', + 'Your comment on {engagement_name} has been rejected'), }, 'VERIFICATION': { 'ID': os.getenv('VERIFICATION_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('VERIFICATION_EMAIL_SUBJECT', + 'SUBJECT': os.getenv('VERIFICATION_EMAIL_SUBJECT', '{engagement_name} - Access link'), }, 'SUBMISSION_RESPONSE': { 'ID': os.getenv('SUBMISSION_RESPONSE_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('SUBMISSION_RESPONSE_EMAIL_SUBJECT', + 'SUBJECT': os.getenv('SUBMISSION_RESPONSE_EMAIL_SUBJECT', 'MET - Your feedback was successfully submitted'), }, - "CLOSEOUT":{ + 'CLOSEOUT': { 'ID': os.getenv('CLOSEOUT_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('CLOSEOUT_EMAIL_SUBJECT', + 'SUBJECT': os.getenv('CLOSEOUT_EMAIL_SUBJECT', 'MET - Engagement Closed'), }, 'ACCESS_REQUEST': { 'ID': os.getenv('ACCESS_REQUEST_EMAIL_TEMPLATE_ID'), - 'SUBJECT': os.getenv('ACCESS_REQUEST_EMAIL_SUBJECT', + 'SUBJECT': os.getenv('ACCESS_REQUEST_EMAIL_SUBJECT', 'MET - New User Access Request'), 'DEST_EMAIL_ADDRESS': os.getenv('ACCESS_REQUEST_EMAIL_ADDRESS'), } @@ -306,17 +318,25 @@ class DevConfig(Config): # pylint: disable=too-few-public-methods class TestConfig(TestKeyConfig, Config): # pylint: disable=too-few-public-methods """ The configuration used when running the test suite. + Extends TestKeyConfig, which contains some large constant keys that are used in the tests. It is stored in a separate file to avoid clutter. TestKeyConfig, in turn, extends the default Config class from above. """ def __init__(self) -> None: + """ + Initialize the object. + + This method is called when an object is created. It sets up the initial + state of the object. + + """ super().__init__() - + # Override Keycloak variables here self.KC['ADMIN_USERNAME'] = os.getenv( - 'KEYCLOAK_TEST_ADMIN_CLIENTID', + 'KEYCLOAK_TEST_ADMIN_CLIENTID', self.KC['ADMIN_USERNAME'] ) self.KC['ADMIN_SECRET'] = os.getenv( @@ -329,12 +349,12 @@ def __init__(self) -> None: # Propagate exceptions up to the test runner TESTING = env_truthy('TESTING', default=True) - # explicitly disable the debugger; we want the tests to fail if an + # explicitly disable the debugger; we want the tests to fail if an # unhandled exception occurs - USE_DEBUG = False + USE_DEBUG = False # JWT OIDC Settings for the test environment - JWT_OIDC_TEST_MODE = True # enables the test mode for flask_jwt_oidc + JWT_OIDC_TEST_MODE = True # enables the test mode for flask_jwt_oidc JWT_OIDC_TEST_AUDIENCE = os.getenv('JWT_OIDC_TEST_AUDIENCE') JWT_OIDC_TEST_CLIENT_SECRET = os.getenv('JWT_OIDC_TEST_CLIENT_SECRET') JWT_OIDC_TEST_ISSUER = os.getenv('JWT_OIDC_TEST_ISSUER') @@ -365,4 +385,3 @@ class DockerConfig(Config): # pylint: disable=too-few-public-methods class ProdConfig(Config): # pylint: disable=too-few-public-methods """Production Config.""" - diff --git a/met-api/src/met_api/generated_documents_carbone_templates/proponent_comments_sheet.xlsx b/met-api/src/met_api/generated_documents_carbone_templates/proponent_comments_sheet.xlsx index 1a568d5a15570fa8af9c5c4e59eb02d94345bd1c..dbb2a557f1d1e7d70cc36938a6c72d17311d225e 100644 GIT binary patch literal 19077 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 literal 7993 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 VHDv None: diff --git a/met-api/src/met_api/services/survey_service.py b/met-api/src/met_api/services/survey_service.py index 2e4b9dc59..61cc05acc 100644 --- a/met-api/src/met_api/services/survey_service.py +++ b/met-api/src/met_api/services/survey_service.py @@ -180,7 +180,7 @@ def update(cls, data: SurveySchema): is_template = survey.get('is_template', None) cls.validate_template_surveys_edit_access(is_template, user_roles) - if engagement and engagement.get('status_id', None) != Status.Draft.value: + if engagement and engagement.get('status_id', None) not in [Status.Draft.value, Status.Published.value]: raise ValueError('Engagement already published') updated_survey = SurveyModel.update_survey(data) diff --git a/met-api/src/met_api/utils/constants.py b/met-api/src/met_api/utils/constants.py index d0a81c7de..4ef88d2fc 100644 --- a/met-api/src/met_api/utils/constants.py +++ b/met-api/src/met_api/utils/constants.py @@ -39,9 +39,11 @@ def get_name_by_value(value): TENANT_ID_JWT_CLAIM = 'tenant_id' + class TestKeyConfig: # pylint: disable=too-few-public-methods - """This config is used to hold bulky test keys so they don't clutter up the - main configuration file for the app. + """ + This config is used to hold bulky test keys so they don't clutter up the main configuration file for the app. + These keys are publicly available and can be used for testing purposes. """ diff --git a/met-api/src/met_api/utils/tenant_validator.py b/met-api/src/met_api/utils/tenant_validator.py index 2696b6433..80d64b6e4 100644 --- a/met-api/src/met_api/utils/tenant_validator.py +++ b/met-api/src/met_api/utils/tenant_validator.py @@ -23,7 +23,6 @@ from flask import abort, current_app, g from met_api.auth import jwt as _jwt -from met_api.utils.constants import TENANT_ID_JWT_CLAIM from met_api.utils.roles import Role from met_api.models.staff_user import StaffUser diff --git a/met-api/src/met_api/utils/user_context.py b/met-api/src/met_api/utils/user_context.py index f09bcf38a..9ca283659 100644 --- a/met-api/src/met_api/utils/user_context.py +++ b/met-api/src/met_api/utils/user_context.py @@ -16,7 +16,7 @@ import functools from typing import Dict -from flask import g, request, current_app +from flask import current_app, g, request from met_api.utils.constants import TENANT_ID_JWT_CLAIM from met_api.utils.roles import Role diff --git a/met-api/src/met_api/utils/util.py b/met-api/src/met_api/utils/util.py index 91a0d1e5d..fdfb642c4 100644 --- a/met-api/src/met_api/utils/util.py +++ b/met-api/src/met_api/utils/util.py @@ -23,6 +23,7 @@ from humps.main import camelize, decamelize + def cors_preflight(methods): """Render an option method on the class.""" @@ -40,6 +41,7 @@ def options(self, *args, **kwargs): # pylint: disable=unused-argument return wrapper + def is_truthy(value: str) -> bool: """ Check if a value is truthy or not. @@ -50,7 +52,6 @@ def is_truthy(value: str) -> bool: return str(value).lower() in ('1', 'true', 'yes', 'y', 'on') - def camelback2snake(camel_dict: dict): """Convert the passed dictionary's keys from camelBack case to snake_case.""" return decamelize(camel_dict) @@ -60,6 +61,7 @@ def snake2camelback(snake_dict: dict): """Convert the passed dictionary's keys from snake_case to camelBack case.""" return camelize(snake_dict) + def allowedorigins(): """Return the allowed origins for CORS.""" return os.getenv('CORS_ORIGINS', '').split(',') diff --git a/met-api/templates/email_rejected_comment_closed.html b/met-api/templates/email_rejected_comment_closed.html new file mode 100644 index 000000000..79179dc09 --- /dev/null +++ b/met-api/templates/email_rejected_comment_closed.html @@ -0,0 +1,30 @@ +

Thank you for taking the time to provide your feedback on {{ engagement_name }}.

+
+

We have reviewed your feedback and can't accept it for the following reason(s):

+
+
    + {% if has_personal_info %} +
  • + Your feedback contains personal information +
  • + {% endif %} {% if has_profanity %} +
  • Your feedback contains profanity or innapropriate language
  • + {% endif %} {% if has_other_reason %} +
  • + Your feedback contains {{ other_reason + }} +
  • + {% endif %} +
+
+

{{review_notes}}

+
+

+ We are sorry but the public commenting period for {{ engagement_name }} + is now closed and your feedback cannot be edited. +

+
+

Thank you,

+
+

The {{tenant_name}} Team

+

{{email_environment}}

\ No newline at end of file diff --git a/met-etl/src/etl_project/services/ops/submission_etl_service.py b/met-etl/src/etl_project/services/ops/submission_etl_service.py index 24c46d8e7..059ce4ffd 100644 --- a/met-etl/src/etl_project/services/ops/submission_etl_service.py +++ b/met-etl/src/etl_project/services/ops/submission_etl_service.py @@ -286,7 +286,7 @@ def _save_survey(met_etl_session, context, answer_key, component, survey, partic # id and the key radio_response = EtlResponseTypeOptionModel( survey_id=survey.id, - request_key=component['key'], + request_key=component['key']+'-'+key, value=answer_label, request_id=component['id']+'-'+key, participant_id=getattr(participant, 'id', None), diff --git a/met-etl/src/etl_project/services/ops/survey_etl_service.py b/met-etl/src/etl_project/services/ops/survey_etl_service.py index 151719ade..d0ab4085f 100644 --- a/met-etl/src/etl_project/services/ops/survey_etl_service.py +++ b/met-etl/src/etl_project/services/ops/survey_etl_service.py @@ -1,12 +1,13 @@ -from dagster import Out, Output, op -from sqlalchemy import func -from datetime import datetime - +from analytics_api.models.available_response_option import AvailableResponseOption as EtlAvailableResponseOption from analytics_api.models.etlruncycle import EtlRunCycle as EtlRunCycleModel from analytics_api.models.request_type_option import RequestTypeOption as EtlRequestTypeOption +from analytics_api.models.response_type_option import ResponseTypeOption as EtlResponseTypeOptionModel from analytics_api.models.survey import Survey as EtlSurveyModel -from met_api.models.survey import Survey as MetSurveyModel from analytics_api.utils.util import FormIoComponentType +from dagster import Out, Output, op +from datetime import datetime +from met_api.models.survey import Survey as MetSurveyModel +from sqlalchemy import func # get the last run cycle id for survey etl @@ -40,7 +41,8 @@ def get_survey_last_run_cycle_time(context, flag_to_run_step_after_engagement): # extract the surveys that have been created or updated after the last run -@op(required_resource_keys={"met_db_session", "met_etl_db_session"}, out={"new_survey": Out(), "updated_survey": Out(), "survey_new_runcycleid": Out()}) +@op(required_resource_keys={"met_db_session", "met_etl_db_session"}, + out={"new_survey": Out(), "updated_survey": Out(), "survey_new_runcycleid": Out()}) def extract_survey(context, survey_last_run_cycle_time, survey_new_runcycleid): session = context.resources.met_db_session default_datetime = datetime(1900, 1, 1, 0, 0, 0, 0) @@ -71,7 +73,7 @@ def extract_survey(context, survey_last_run_cycle_time, survey_new_runcycleid): # load the surveys created or updated after last run to the analytics database -@op(required_resource_keys={"met_db_session", "met_etl_db_session"},out={"survey_new_runcycleid": Out()}) +@op(required_resource_keys={"met_db_session", "met_etl_db_session"}, out={"survey_new_runcycleid": Out()}) def load_survey(context, new_survey, updated_survey, survey_new_runcycleid): session = context.resources.met_etl_db_session all_surveys = new_survey + updated_survey @@ -83,23 +85,29 @@ def load_survey(context, new_survey, updated_survey, survey_new_runcycleid): _do_etl_survey_data(session, survey, survey_new_runcycleid) + _update_survey_responses_with_active_survey_id(session, survey) + if survey.form_json is None: context.log.info('Survey Found without form_json: %s. Skipping it', survey.id) continue form_type = survey.form_json.get('display', None) + page_position = 0 # Initialize the page-level position + # check and load data for single page survey. if form_type == 'form': form_components = survey.form_json.get('components', None) - extract_survey_components(context, session, survey, survey_new_runcycleid, form_components) + page_position = extract_survey_components(context, session, survey, survey_new_runcycleid, + form_components, page_position) # check and load data for multi page survey. if form_type == 'wizard': pages = survey.form_json.get('components', None) for page in pages: form_components = page.get('components', None) - extract_survey_components(context, session, survey, survey_new_runcycleid, form_components) + page_position = extract_survey_components(context, session, survey, survey_new_runcycleid, + form_components, page_position) yield Output(survey_new_runcycleid, "survey_new_runcycleid") @@ -107,25 +115,24 @@ def load_survey(context, new_survey, updated_survey, survey_new_runcycleid): session.close() + # extract components within a survey -def extract_survey_components(context, session, survey, survey_new_runcycleid, form_components): +def extract_survey_components(context, session, survey, survey_new_runcycleid, form_components, position): if (form_components) is None: context.log.info('Survey Found without any component in form_json: %s. Skipping it', survey.id) - return + return position - _inactivate_old_questions(session, survey.id) - - position = 0 + _refresh_questions_and_available_option_status(session, survey.id) for component in form_components: position = position + 1 component_type = component.get('type', None) context.log.info('Survey: %s.%s Processing component with id %s and type: %s and label %s ', - survey.id, - survey.name, - component.get('id', None), - component_type, - component.get('label', None)) + survey.id, + survey.name, + component.get('id', None), + component_type, + component.get('label', None)) if not component_type: continue @@ -134,13 +141,18 @@ def extract_survey_components(context, session, survey, survey_new_runcycleid, f if has_valid_question_type: etl_survey = session.query(EtlSurveyModel.id).filter(EtlSurveyModel.source_survey_id == survey.id, - EtlSurveyModel.is_active == True) + EtlSurveyModel.is_active == True) for survey_id in etl_survey: - _do_etl_survey_inputs(session, survey_id, component, component_type, - survey_new_runcycleid, position) + position = _do_etl_survey_inputs(session, survey_id, component, component_type, + survey_new_runcycleid, position) + _load_available_response_option(context, session, survey_id, component, component_type, + survey_new_runcycleid) + + return position + # inactivate if record is existing in analytics database -def _inactivate_old_questions(session, source_survey_id): +def _refresh_questions_and_available_option_status(session, source_survey_id): etl_survey_model = session.query(EtlSurveyModel.id).filter(EtlSurveyModel.source_survey_id == source_survey_id, EtlSurveyModel.is_active == False) if not etl_survey_model: @@ -150,6 +162,8 @@ def _inactivate_old_questions(session, source_survey_id): for survey_id in etl_survey_model: session.query(EtlRequestTypeOption).filter(EtlRequestTypeOption.survey_id == survey_id).update(deactive_flag) + session.query(EtlAvailableResponseOption).filter( + EtlAvailableResponseOption.survey_id == survey_id).update(deactive_flag) def _do_etl_survey_data(session, survey, survey_new_runcycleid): @@ -171,37 +185,100 @@ def _do_etl_survey_inputs(session, survey_id, component, component_type, survey_ questions = component.get('questions', None) if not questions: - return + return position for question in questions: + position = position + 1 model_name = EtlRequestTypeOption(survey_id=survey_id, - request_id=component['id'] + '-' + question['value'], - label=question['label'], - is_active=True, - key=component['key'] + '-' + question['value'], - type=component['type'], - runcycle_id=survey_new_runcycleid, - position=position - ) + request_id=component['id'] + '-' + question['value'], + label=question['label'], + is_active=True, + key=component['key'] + '-' + question['value'], + type=component['type'], + runcycle_id=survey_new_runcycleid, + position=position + ) session.add(model_name) session.commit() else: model_name = EtlRequestTypeOption(survey_id=survey_id, - request_id=component['id'], - label=component['label'], - is_active=True, - key=component['key'], - type=component['type'], - runcycle_id=survey_new_runcycleid, - position=position - ) + request_id=component['id'], + label=component['label'], + is_active=True, + key=component['key'], + type=component['type'], + runcycle_id=survey_new_runcycleid, + position=position + ) session.add(model_name) session.commit() + return position + + +# load data to table available response option +def _load_available_response_option(context, session, survey_id, component, component_type, survey_new_runcycleid): + + if component_type == FormIoComponentType.SURVEY.value: + _load_survey_available_response(session, component, survey_id, survey_new_runcycleid) + elif component_type == FormIoComponentType.SELECTLIST.value: + _load_selectlist_available_response(session, component, survey_id, survey_new_runcycleid) + else: + _load_default_available_response(session, component, survey_id, survey_new_runcycleid) + + +def _load_survey_available_response(session, component, survey_id, survey_new_runcycleid): + values = component.get('values', None) + if not values: + return + + questions = component.get('questions', None) + if not questions: + return + + for question in questions: + request_key = component['key'] + '-' + question['value'] + _do_etl_available_response_data(session, component, survey_id, values, + request_key, survey_new_runcycleid) + +def _load_selectlist_available_response(session, component, survey_id, survey_new_runcycleid): + data = component.get('data', None) + values = data.get('values', None) + + if not values: + return + + request_key = component['key'] + _do_etl_available_response_data(session, component, survey_id, values, + request_key, survey_new_runcycleid) + +def _load_default_available_response(session, component, survey_id, survey_new_runcycleid): + values = component.get('values', None) + if not values: + return + + request_key = component['key'] + _do_etl_available_response_data(session, component, survey_id, values, + request_key, survey_new_runcycleid) + + +def _do_etl_available_response_data(session, component, survey_id, values, request_key, survey_new_runcycleid): + for value in values: + model_name = EtlAvailableResponseOption(survey_id=survey_id, + request_key=request_key, + value=value['label'], + request_id=component['id'], + is_active=True, + runcycle_id=survey_new_runcycleid) + + session.add(model_name) + + session.commit() + def _validate_form_type(context, component_type): component_type = component_type.lower() @@ -222,7 +299,8 @@ def survey_end_run_cycle(context, survey_new_runcycleid): met_etl_db_session.query(EtlRunCycleModel).filter( EtlRunCycleModel.id == survey_new_runcycleid, EtlRunCycleModel.packagename == 'survey', EtlRunCycleModel.success == False).update( - {'success': True, 'enddatetime': datetime.utcnow(), 'description': 'ended the load for tables survey and requests'}) + {'success': True, 'enddatetime': datetime.utcnow(), + 'description': 'ended the load for tables survey and requests'}) context.log.info("run cycle ended for survey table") @@ -231,3 +309,25 @@ def survey_end_run_cycle(context, survey_new_runcycleid): met_etl_db_session.close() yield Output("survey", "flag_to_run_step_after_survey") + + +def _update_survey_responses_with_active_survey_id(session, survey): + etl_active_survey_id = session.query(EtlSurveyModel.id).filter( + EtlSurveyModel.source_survey_id == survey.id, EtlSurveyModel.is_active == True).first() + + subquery = ( + session.query(EtlSurveyModel.id) + .filter(EtlSurveyModel.source_survey_id == survey.id) + .subquery() + ) + + # Fetch response records + response_records = session.query(EtlResponseTypeOptionModel).filter( + EtlResponseTypeOptionModel.survey_id.in_(subquery)).all() + + # Update each response record individually + for record in response_records: + session.query(EtlResponseTypeOptionModel).filter(EtlResponseTypeOptionModel.id == record.id).update( + {'survey_id': etl_active_survey_id}, synchronize_session='fetch') + + session.commit() diff --git a/met-web/package-lock.json b/met-web/package-lock.json index adc464edd..6ab3b942d 100644 --- a/met-web/package-lock.json +++ b/met-web/package-lock.json @@ -1,12 +1,12 @@ { "name": "client", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "client", - "version": "1.0.1", + "version": "1.1.0", "dependencies": { "@arcgis/core": "^4.26.5", "@bcgov/bc-sans": "^2.0", @@ -50,7 +50,7 @@ "lodash": "^4.17.21", "mapbox-gl": "^2.13.0", "maplibre-gl": "^1.15.3", - "met-formio": "^1.0.13-rc1", + "met-formio": "^1.0.14-rc1", "mui-sx": "^1.0.0", "node-sass": "^7.0.3", "react": "^18.0.0", @@ -3357,7 +3357,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -3369,7 +3369,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -4175,6 +4175,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, "dependencies": { "@jest/console": "^28.1.3", "@jest/reporters": "^28.1.3", @@ -4222,6 +4223,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4237,6 +4239,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -4251,6 +4254,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -4262,6 +4266,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, "dependencies": { "@jest/fake-timers": "^28.1.3", "@jest/types": "^28.1.3", @@ -4276,6 +4281,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, "dependencies": { "expect": "^28.1.3", "jest-snapshot": "^28.1.3" @@ -4288,6 +4294,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, "dependencies": { "jest-get-type": "^28.0.2" }, @@ -4299,6 +4306,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@sinonjs/fake-timers": "^9.1.2", @@ -4315,6 +4323,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, "dependencies": { "@jest/environment": "^28.1.3", "@jest/expect": "^28.1.3", @@ -4328,6 +4337,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^28.1.3", @@ -4371,6 +4381,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4397,6 +4408,7 @@ "version": "28.1.2", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.13", "callsites": "^3.0.0", @@ -4424,6 +4436,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, "dependencies": { "@jest/test-result": "^28.1.3", "graceful-fs": "^4.2.9", @@ -4438,6 +4451,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^28.1.3", @@ -4463,6 +4477,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5283,6 +5298,7 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -5662,25 +5678,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "dev": true }, "node_modules/@turf/along": { "version": "6.5.0", @@ -8888,6 +8904,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, "dependencies": { "@jest/transform": "^28.1.3", "@types/babel__core": "^7.1.14", @@ -8908,6 +8925,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9001,6 +9019,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -9130,6 +9149,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^28.1.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -10400,7 +10420,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "dev": true }, "node_modules/cross-fetch": { "version": "3.1.8", @@ -11518,7 +11538,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.3.1" } @@ -13026,6 +13046,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, "dependencies": { "@jest/expect-utils": "^28.1.3", "jest-get-type": "^28.0.2", @@ -13041,6 +13062,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13056,6 +13078,7 @@ "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -13064,6 +13087,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -13078,6 +13102,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -13092,6 +13117,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -13106,6 +13132,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -15606,6 +15633,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, "dependencies": { "@jest/core": "^28.1.3", "@jest/types": "^28.1.3", @@ -15631,6 +15659,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, "dependencies": { "execa": "^5.0.0", "p-limit": "^3.1.0" @@ -15643,6 +15672,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, "dependencies": { "@jest/environment": "^28.1.3", "@jest/expect": "^28.1.3", @@ -15672,6 +15702,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15687,6 +15718,7 @@ "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -15695,6 +15727,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -15709,6 +15742,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -15723,6 +15757,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -15737,6 +15772,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -15748,6 +15784,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^28.1.3", @@ -15792,6 +15829,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15807,6 +15845,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -15821,6 +15860,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -15869,6 +15909,7 @@ "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -15880,6 +15921,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "chalk": "^4.0.0", @@ -15895,6 +15937,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15910,6 +15953,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -15924,6 +15968,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -15954,6 +15999,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, "dependencies": { "@jest/environment": "^28.1.3", "@jest/fake-timers": "^28.1.3", @@ -15995,6 +16041,7 @@ "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -16003,6 +16050,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@types/graceful-fs": "^4.1.3", @@ -16485,6 +16533,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, "dependencies": { "jest-get-type": "^28.0.2", "pretty-format": "^28.1.3" @@ -16497,6 +16546,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -16508,6 +16558,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -16618,6 +16669,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*" @@ -16654,6 +16706,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -16673,6 +16726,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, "dependencies": { "jest-regex-util": "^28.0.2", "jest-snapshot": "^28.1.3" @@ -16685,6 +16739,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16700,6 +16755,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, "dependencies": { "@jest/console": "^28.1.3", "@jest/environment": "^28.1.3", @@ -16731,6 +16787,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16746,6 +16803,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, "dependencies": { "@jest/environment": "^28.1.3", "@jest/fake-timers": "^28.1.3", @@ -16778,6 +16836,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16805,6 +16864,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -16838,6 +16898,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16853,6 +16914,7 @@ "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -16861,6 +16923,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -16875,6 +16938,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -16889,6 +16953,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -16903,6 +16968,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -16951,6 +17017,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "camelcase": "^6.2.0", @@ -16967,6 +17034,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "engines": { "node": ">=10" }, @@ -16978,6 +17046,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16993,6 +17062,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -17007,6 +17077,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -17172,6 +17243,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17187,6 +17259,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, "dependencies": { "@jest/core": "^28.1.3", "@jest/test-result": "^28.1.3", @@ -17723,7 +17796,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "dev": true }, "node_modules/make-fetch-happen": { "version": "9.1.0", @@ -17870,39 +17943,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" }, - "node_modules/maplibre-gl/node_modules/mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "peer": true, - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, "node_modules/maplibre-gl/node_modules/potpack": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", @@ -18028,9 +18068,9 @@ } }, "node_modules/met-formio": { - "version": "1.0.13-rc1", - "resolved": "https://registry.npmjs.org/met-formio/-/met-formio-1.0.13-rc1.tgz", - "integrity": "sha512-nRLbWJyrvQUjr1da7i5FLe0k7IB84r05kMrDL7osBVTml64U9zVbKjtI/YTEoa6DlCiDHoUjtToZM1x9zvOhyA==", + "version": "1.0.14-rc1", + "resolved": "https://registry.npmjs.org/met-formio/-/met-formio-1.0.14-rc1.tgz", + "integrity": "sha512-JetCvoIhfzsVSzgn7/PgC83NTl5Nq19iM2ndq5tmV59y0Iul0hDBZJssxrHOFXasBldEeKsIES/ltIGAVJFXWw==", "dependencies": { "formiojs": "^4.14.6", "lodash": "^4.17.21", @@ -25130,7 +25170,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -25173,7 +25213,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.4.0" } @@ -25182,7 +25222,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "dev": true }, "node_modules/tsconfig-paths": { "version": "3.14.2", @@ -25630,12 +25670,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -26491,6 +26532,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -26615,7 +26657,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -27497,8 +27539,7 @@ "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": {} + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==" }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -28982,7 +29023,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "dev": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -28991,7 +29032,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -29116,14 +29157,12 @@ "@csstools/postcss-unset-value": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "requires": {} + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==" }, "@csstools/selector-specificity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "requires": {} + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==" }, "@date-io/core": { "version": "2.16.0", @@ -29456,8 +29495,7 @@ "@hookform/resolvers": { "version": "2.9.8", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.8.tgz", - "integrity": "sha512-iVVjH0USq+1TqDdGkWe2M1x7Wn5OFPgVRo7CbWFsXTqqXqCaZtZcnzJu+UhljCWbthFWxWGXKLGYUDPZ04oVvQ==", - "requires": {} + "integrity": "sha512-iVVjH0USq+1TqDdGkWe2M1x7Wn5OFPgVRo7CbWFsXTqqXqCaZtZcnzJu+UhljCWbthFWxWGXKLGYUDPZ04oVvQ==" }, "@humanwhocodes/config-array": { "version": "0.9.5", @@ -29526,6 +29564,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, "requires": { "@jest/console": "^28.1.3", "@jest/reporters": "^28.1.3", @@ -29562,6 +29601,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29571,6 +29611,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -29581,7 +29622,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -29591,6 +29633,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, "requires": { "@jest/fake-timers": "^28.1.3", "@jest/types": "^28.1.3", @@ -29602,6 +29645,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, "requires": { "expect": "^28.1.3", "jest-snapshot": "^28.1.3" @@ -29611,6 +29655,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, "requires": { "jest-get-type": "^28.0.2" } @@ -29619,6 +29664,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, "requires": { "@jest/types": "^28.1.3", "@sinonjs/fake-timers": "^9.1.2", @@ -29632,6 +29678,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, "requires": { "@jest/environment": "^28.1.3", "@jest/expect": "^28.1.3", @@ -29642,6 +29689,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^28.1.3", @@ -29674,6 +29722,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29693,6 +29742,7 @@ "version": "28.1.2", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.13", "callsites": "^3.0.0", @@ -29714,6 +29764,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, "requires": { "@jest/test-result": "^28.1.3", "graceful-fs": "^4.2.9", @@ -29725,6 +29776,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^28.1.3", @@ -29747,6 +29799,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29992,8 +30045,7 @@ "@mui/types": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", - "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", - "requires": {} + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==" }, "@mui/utils": { "version": "5.13.7", @@ -30224,6 +30276,7 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -30461,25 +30514,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "dev": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "dev": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "dev": true }, "@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "dev": true }, "@turf/along": { "version": "6.5.0", @@ -32676,14 +32729,12 @@ "acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-walk": { "version": "7.2.0", @@ -33067,6 +33118,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, "requires": { "@jest/transform": "^28.1.3", "@types/babel__core": "^7.1.14", @@ -33081,6 +33133,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -33113,8 +33166,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "json-schema-traverse": { "version": "0.4.1", @@ -33149,6 +33201,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -33169,8 +33222,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.4.4", @@ -33256,6 +33308,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, "requires": { "babel-plugin-jest-hoist": "^28.1.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -34243,7 +34296,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "dev": true }, "cross-fetch": { "version": "3.1.8", @@ -34333,8 +34386,7 @@ "css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "requires": {} + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==" }, "css-has-pseudo": { "version": "3.0.4", @@ -34427,8 +34479,7 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" }, "css-select": { "version": "2.1.0", @@ -34547,8 +34598,7 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -34766,8 +34816,7 @@ "date-fns-tz": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.6.tgz", - "integrity": "sha512-C8q7mErvG4INw1ZwAFmPlGjEo5Sv4udjKVbTc03zpP9cu6cp5AemFzKhz0V68LGcWEtX5mJudzzg3G04emIxLA==", - "requires": {} + "integrity": "sha512-C8q7mErvG4INw1ZwAFmPlGjEo5Sv4udjKVbTc03zpP9cu6cp5AemFzKhz0V68LGcWEtX5mJudzzg3G04emIxLA==" }, "dayjs": { "version": "1.11.6", @@ -35074,7 +35123,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true + "dev": true }, "diff-sequences": { "version": "27.5.1", @@ -35252,8 +35301,7 @@ "draftjs-utils": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.10.2.tgz", - "integrity": "sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg==", - "requires": {} + "integrity": "sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg==" }, "dragula": { "version": "3.7.3", @@ -35720,8 +35768,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-config-react-app": { "version": "7.0.1", @@ -35943,8 +35990,7 @@ "eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" }, "eslint-plugin-testing-library": { "version": "5.11.0", @@ -36197,6 +36243,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, "requires": { "@jest/expect-utils": "^28.1.3", "jest-get-type": "^28.0.2", @@ -36209,6 +36256,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -36217,12 +36265,14 @@ "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true }, "jest-diff": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -36234,6 +36284,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -36245,6 +36296,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -36255,7 +36307,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -36642,8 +36695,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "chalk": { "version": "4.1.2", @@ -37375,8 +37427,7 @@ "html-to-draftjs": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/html-to-draftjs/-/html-to-draftjs-1.5.0.tgz", - "integrity": "sha512-kggLXBNciKDwKf+KYsuE+V5gw4dZ7nHyGMX9m0wy7urzWjKGWyNFetmArRLvRV0VrxKN70WylFsJvMTJx02OBQ==", - "requires": {} + "integrity": "sha512-kggLXBNciKDwKf+KYsuE+V5gw4dZ7nHyGMX9m0wy7urzWjKGWyNFetmArRLvRV0VrxKN70WylFsJvMTJx02OBQ==" }, "html-to-image": { "version": "1.11.11", @@ -37576,8 +37627,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "6.1.5", @@ -38083,6 +38133,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, "requires": { "@jest/core": "^28.1.3", "@jest/types": "^28.1.3", @@ -38094,6 +38145,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38103,6 +38155,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, "requires": { "@jest/core": "^28.1.3", "@jest/test-result": "^28.1.3", @@ -38124,6 +38177,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, "requires": { "execa": "^5.0.0", "p-limit": "^3.1.0" @@ -38133,6 +38187,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, "requires": { "@jest/environment": "^28.1.3", "@jest/expect": "^28.1.3", @@ -38159,6 +38214,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38167,12 +38223,14 @@ "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true }, "jest-diff": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -38184,6 +38242,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -38195,6 +38254,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -38205,7 +38265,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -38215,6 +38276,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^28.1.3", @@ -38244,6 +38306,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38253,6 +38316,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -38263,7 +38327,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -38300,6 +38365,7 @@ "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, "requires": { "detect-newline": "^3.0.0" } @@ -38308,6 +38374,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, "requires": { "@jest/types": "^28.1.3", "chalk": "^4.0.0", @@ -38320,6 +38387,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38329,6 +38397,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -38339,7 +38408,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -38365,6 +38435,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, "requires": { "@jest/environment": "^28.1.3", "@jest/fake-timers": "^28.1.3", @@ -38395,12 +38466,14 @@ "jest-get-type": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true }, "jest-haste-map": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, "requires": { "@jest/types": "^28.1.3", "@types/graceful-fs": "^4.1.3", @@ -38793,6 +38866,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, "requires": { "jest-get-type": "^28.0.2", "pretty-format": "^28.1.3" @@ -38801,12 +38875,14 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true }, "pretty-format": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -38892,6 +38968,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, "requires": { "@jest/types": "^28.1.3", "@types/node": "*" @@ -38900,8 +38977,7 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "28.0.2", @@ -38912,6 +38988,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -38928,6 +39005,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38939,6 +39017,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, "requires": { "jest-regex-util": "^28.0.2", "jest-snapshot": "^28.1.3" @@ -38948,6 +39027,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, "requires": { "@jest/console": "^28.1.3", "@jest/environment": "^28.1.3", @@ -38976,6 +39056,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38987,6 +39068,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, "requires": { "@jest/environment": "^28.1.3", "@jest/fake-timers": "^28.1.3", @@ -39016,6 +39098,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -39036,6 +39119,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -39066,6 +39150,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -39074,12 +39159,14 @@ "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true }, "jest-diff": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", @@ -39091,6 +39178,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", @@ -39102,6 +39190,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -39112,7 +39201,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -39152,6 +39242,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, "requires": { "@jest/types": "^28.1.3", "camelcase": "^6.2.0", @@ -39164,12 +39255,14 @@ "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -39179,6 +39272,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -39189,7 +39283,8 @@ "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true } } } @@ -39712,7 +39807,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "dev": true }, "make-fetch-happen": { "version": "9.1.0", @@ -39828,8 +39923,7 @@ "@mapbox/mapbox-gl-supported": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "requires": {} + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" }, "@mapbox/tiny-sdf": { "version": "1.2.5", @@ -39841,36 +39935,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" }, - "mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "peer": true, - "requires": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - } - }, "potpack": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", @@ -39973,9 +40037,9 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "met-formio": { - "version": "1.0.13-rc1", - "resolved": "https://registry.npmjs.org/met-formio/-/met-formio-1.0.13-rc1.tgz", - "integrity": "sha512-nRLbWJyrvQUjr1da7i5FLe0k7IB84r05kMrDL7osBVTml64U9zVbKjtI/YTEoa6DlCiDHoUjtToZM1x9zvOhyA==", + "version": "1.0.14-rc1", + "resolved": "https://registry.npmjs.org/met-formio/-/met-formio-1.0.14-rc1.tgz", + "integrity": "sha512-JetCvoIhfzsVSzgn7/PgC83NTl5Nq19iM2ndq5tmV59y0Iul0hDBZJssxrHOFXasBldEeKsIES/ltIGAVJFXWw==", "requires": { "formiojs": "^4.14.6", "lodash": "^4.17.21", @@ -40937,8 +41001,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.4", @@ -41036,26 +41099,22 @@ "postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" }, "postcss-double-position-gradients": { "version": "3.1.2", @@ -41077,8 +41136,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.4", @@ -41099,14 +41157,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "requires": {} + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==" }, "postcss-image-set-function": { "version": "4.0.7", @@ -41129,8 +41185,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.1", @@ -41178,14 +41233,12 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.1.7", @@ -41246,8 +41299,7 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { "version": "4.0.3", @@ -41305,8 +41357,7 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -41377,8 +41428,7 @@ "postcss-opacity-percentage": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "requires": {} + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==" }, "postcss-ordered-values": { "version": "5.1.3", @@ -41400,8 +41450,7 @@ "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.5", @@ -41495,8 +41544,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "6.0.1", @@ -42150,8 +42198,7 @@ "react-hook-form": { "version": "7.37.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.37.0.tgz", - "integrity": "sha512-6NFTxsnw+EXSpNNvLr5nFMjPdYKRryQcelTHg7zwBB6vAzfPIcZq4AExP4heVlwdzntepQgwiOQW4z7Mr99Lsg==", - "requires": {} + "integrity": "sha512-6NFTxsnw+EXSpNNvLr5nFMjPdYKRryQcelTHg7zwBB6vAzfPIcZq4AExP4heVlwdzntepQgwiOQW4z7Mr99Lsg==" }, "react-i18next": { "version": "13.0.2", @@ -42175,8 +42222,7 @@ "react-if": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/react-if/-/react-if-4.1.4.tgz", - "integrity": "sha512-bjufPfCdPBiBy9EO/BeoxaqGc/xCwTu0coKtHfjpJw+v85DLMbpG43IUPISh+m3DzENx1rOYLpqbp2KaDmEYlg==", - "requires": {} + "integrity": "sha512-bjufPfCdPBiBy9EO/BeoxaqGc/xCwTu0coKtHfjpJw+v85DLMbpG43IUPISh+m3DzENx1rOYLpqbp2KaDmEYlg==" }, "react-is": { "version": "18.2.0", @@ -43148,8 +43194,7 @@ "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" }, "xml-name-validator": { "version": "3.0.0", @@ -43360,8 +43405,7 @@ "redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "requires": {} + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" }, "regenerate": { "version": "1.4.2", @@ -43690,8 +43734,7 @@ "rifm": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz", - "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==", - "requires": {} + "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==" }, "rimraf": { "version": "3.0.2", @@ -43869,8 +43912,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "json-schema-traverse": { "version": "0.4.1", @@ -44581,8 +44623,7 @@ "style-loader": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "requires": {} + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==" }, "stylehacks": { "version": "5.1.1", @@ -45116,7 +45157,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, + "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -45137,13 +45178,13 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "devOptional": true + "dev": true }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "dev": true } } }, @@ -45409,14 +45450,12 @@ "use-memo-one": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "requires": {} + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==" }, "use-sync-external-store": { "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==", - "requires": {} + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" }, "util": { "version": "0.12.5", @@ -45479,12 +45518,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "dev": true }, "v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -46174,6 +46214,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -46182,8 +46223,7 @@ "ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" }, "xml-name-validator": { "version": "4.0.0", @@ -46256,7 +46296,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true + "dev": true }, "yocto-queue": { "version": "0.1.0", diff --git a/met-web/package.json b/met-web/package.json index 24cf52945..77c937b91 100644 --- a/met-web/package.json +++ b/met-web/package.json @@ -45,7 +45,7 @@ "lodash": "^4.17.21", "mapbox-gl": "^2.13.0", "maplibre-gl": "^1.15.3", - "met-formio": "^1.0.13-rc1", + "met-formio": "^1.0.14-rc1", "mui-sx": "^1.0.0", "node-sass": "^7.0.3", "react": "^18.0.0", diff --git a/met-web/src/apiManager/httpRequestHandler/index.ts b/met-web/src/apiManager/httpRequestHandler/index.ts index 9f5f5a1d1..f6c5ad8b7 100644 --- a/met-web/src/apiManager/httpRequestHandler/index.ts +++ b/met-web/src/apiManager/httpRequestHandler/index.ts @@ -1,16 +1,29 @@ -import axios from 'axios'; +import axios, { AxiosRequestConfig } from 'axios'; import UserService from 'services/userService'; -const GetRequest = (url: string, params = {}, headers = {}) => { - return axios.get(url, { +const GetRequest = (url: string, params = {}, headers = {}, responseType?: string) => { + const defaultHeaders = { + 'Content-type': 'application/json', + Authorization: `Bearer ${UserService.getToken()}`, + 'tenant-id': `${sessionStorage.getItem('tenantId')}`, + }; + + const finalHeaders = { + ...defaultHeaders, + ...headers, + }; + + const requestOptions: AxiosRequestConfig = { params: params, - headers: { - 'Content-type': 'application/json', - Authorization: `Bearer ${UserService.getToken()}`, - 'tenant-id': `${sessionStorage.getItem('tenantId')}`, - ...headers, - }, - }); + headers: finalHeaders, + }; + + // Conditionally add responseType to requestOptions if provided + if (responseType) { + requestOptions.responseType = responseType as AxiosRequestConfig['responseType']; + } + + return axios.get(url, requestOptions); }; const PostRequest = (url: string, data = {}, params = {}) => { diff --git a/met-web/src/components/comments/admin/review/emailPreview/EmailPreview.tsx b/met-web/src/components/comments/admin/review/emailPreview/EmailPreview.tsx index 82cbaa7b1..820321499 100644 --- a/met-web/src/components/comments/admin/review/emailPreview/EmailPreview.tsx +++ b/met-web/src/components/comments/admin/review/emailPreview/EmailPreview.tsx @@ -6,6 +6,7 @@ import { Survey } from 'models/survey'; import { formatDate } from 'components/common/dateHelper'; import { useAppSelector } from 'hooks'; import { TenantState } from 'reduxSlices/tenantSlice'; +import { EngagementStatus } from 'constants/engagementStatus'; export default function EmailPreview({ survey, @@ -18,6 +19,8 @@ export default function EmailPreview({ }) { const scheduledDate = formatDate(survey.engagement?.scheduled_date || '', 'MMM DD YYYY'); const tenant: TenantState = useAppSelector((state) => state.tenant); + const isClosed = survey.engagement?.engagement_status.id === EngagementStatus.Closed; + const engagementName = survey.engagement?.name || ''; return ( @@ -34,27 +37,38 @@ export default function EmailPreview({ - Thank you for taking the time to provide your feedback on {survey.engagement?.name || ''}. + Thank you for taking the time to provide your feedback on {engagementName}. {children} - You can edit and re-submit your feedback. The comment period is open until {scheduledDate}. You - must re-submit your feedback before the comment period closes. + {!isClosed ? ( + <> + You can edit and re-submit your feedback. The comment period is open until {''} + {scheduledDate}. You must re-submit your feedback before the comment period closes. + + ) : ( + <> + We are sorry but the public commenting period for {engagementName} is now closed and + your feedback cannot be edited. + + )} - - Edit your feedback - + {!isClosed ? ( + + Edit your feedback + + ) : null} Thank you, diff --git a/met-web/src/components/comments/admin/textListing/index.tsx b/met-web/src/components/comments/admin/textListing/index.tsx index b8bb41af8..5f071ffd5 100644 --- a/met-web/src/components/comments/admin/textListing/index.tsx +++ b/met-web/src/components/comments/admin/textListing/index.tsx @@ -94,7 +94,7 @@ const CommentTextListing = () => { try { setIsExporting(true); const response = await getProponentCommentSheet({ survey_id: survey.id }); - downloadFile(response, `PUBLIC - ${survey.engagement?.name || ''} - ${formatToUTC(Date())}.csv`); + downloadFile(response, `PUBLIC - ${survey.engagement?.name || ''} - ${formatToUTC(Date())}.xlsx`); setIsExporting(false); handleExportToCSVClose(); // Close the menu after export } catch (error) { diff --git a/met-web/src/components/engagement/dashboard/comment/CommentTable.tsx b/met-web/src/components/engagement/dashboard/comment/CommentTable.tsx index b9e663180..54b4efa0f 100644 --- a/met-web/src/components/engagement/dashboard/comment/CommentTable.tsx +++ b/met-web/src/components/engagement/dashboard/comment/CommentTable.tsx @@ -1,22 +1,61 @@ import React, { useContext } from 'react'; import MetTable from 'components/common/Table'; -import { Comment } from 'models/comment'; import { HeadCell } from 'components/common/Table/types'; -import { Skeleton, Typography } from '@mui/material'; -import { CommentViewContext } from './CommentViewContext'; +import { MetLabel, MetParagraph } from 'components/common'; +import { Skeleton } from '@mui/material'; +import { CommentViewContext, TransformedComment } from './CommentViewContext'; + +export interface CommentType { + label: string; + submission_date: string; + submission_id: number; + text: string; +} const CommentTable = () => { const { isCommentsListLoading, comments, paginationOptions, pageInfo, handleChangePagination, tableLoading } = useContext(CommentViewContext); - const headCells: HeadCell[] = [ + const transformedArray: TransformedComment[] = comments.reduce((acc: TransformedComment[], comment) => { + const existingSubmission = acc.find((submission) => submission.submission_id === comment.submission_id); + + if (existingSubmission) { + existingSubmission.comments.push({ label: comment.label, text: comment.text }); + } else { + acc.push({ + submission_id: comment.submission_id, + submission_date: comment.submission_date, + comments: [{ label: comment.label, text: comment.text }], + }); + } + + return acc; + }, []); + + // Sort transformedArray in descending order based on submission_id + transformedArray.sort((a, b) => b.submission_id - a.submission_id); + + const headCells: HeadCell[] = [ { - key: 'text', + key: 'comments', numeric: false, disablePadding: false, - label: 'Content', - allowSort: true, - renderCell: (row: Comment) => row.text, + label: 'Comment', + allowSort: false, + customStyle: { width: '80%' }, + align: 'left', + renderCell: (row: TransformedComment) => ( + <> + {row.comments.map((comment) => ( +
+ {comment.label} +
+ {comment.text} +
+
+ ))} + + ), }, { key: 'submission_date', @@ -26,7 +65,7 @@ const CommentTable = () => { allowSort: false, customStyle: { width: '20%' }, align: 'right', - renderCell: (row: Comment) => {row.submission_date}, + renderCell: (row: TransformedComment) => {row.submission_date}, }, ]; @@ -38,7 +77,7 @@ const CommentTable = () => { <> ; + paginationOptions: PaginationOptions; pageInfo: PageInfo; - handleChangePagination: (_paginationOptions: PaginationOptions) => void; + handleChangePagination: (_paginationOptions: PaginationOptions) => void; tableLoading: boolean; } @@ -34,7 +40,7 @@ export const CommentViewContext = createContext({ comments: [], paginationOptions: { page: 0, size: 10 }, pageInfo: { total: 0 }, - handleChangePagination: (_paginationOptions: PaginationOptions) => { + handleChangePagination: (_paginationOptions: PaginationOptions) => { throw new Error('Unimplemented'); }, tableLoading: false, @@ -52,7 +58,7 @@ export const CommentViewProvider = ({ children }: { children: JSX.Element | JSX. const [isEngagementLoading, setEngagementLoading] = useState(true); const [isCommentsListLoading, setIsCommentsListLoading] = useState(true); const [comments, setComments] = useState([]); - const [paginationOptions, setPaginationOptions] = useState>({ + const [paginationOptions, setPaginationOptions] = useState>({ page: 1, size: 10, }); @@ -140,7 +146,7 @@ export const CommentViewProvider = ({ children }: { children: JSX.Element | JSX. } }; - const handleChangePagination = (paginationOptions: PaginationOptions) => { + const handleChangePagination = (paginationOptions: PaginationOptions) => { setPaginationOptions(paginationOptions); }; diff --git a/met-web/src/components/publicDashboard/KPI/SurveyEmailsSent.tsx b/met-web/src/components/publicDashboard/KPI/SurveyEmailsSent.tsx index 347d5e0da..ea6038a53 100644 --- a/met-web/src/components/publicDashboard/KPI/SurveyEmailsSent.tsx +++ b/met-web/src/components/publicDashboard/KPI/SurveyEmailsSent.tsx @@ -112,9 +112,9 @@ const SurveyEmailsSent = ({ engagement, engagementIsLoading }: SurveyEmailsSentP barSize={circleSize / 4} data={[data]} startAngle={225} - endAngle={-270} + endAngle={-225} > - + { const [data, setData] = useState(null); + const [emailVerificationData, setEmailVerificationData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isError, setIsError] = useState(false); const isTablet = useMediaQuery((theme: Theme) => theme.breakpoints.down('md')); @@ -40,6 +41,11 @@ const SurveysCompleted = ({ engagement, engagementIsLoading }: SurveysCompletedP count_for: 'survey_completed', }); setData(response); + const emailVerification = await getAggregatorData({ + engagement_id: Number(engagement.id), + count_for: 'email_verification', + }); + setEmailVerificationData(emailVerification); } catch (error) { if (axios.isAxiosError(error)) { setErrors(error); @@ -113,9 +119,14 @@ const SurveysCompleted = ({ engagement, engagementIsLoading }: SurveysCompletedP barSize={circleSize / 4} data={[data]} startAngle={225} - endAngle={-270} + endAngle={-225} > - + { dispatch( openNotification({ severity: 'warning', - text: 'Engagement already published. Saving is disabled.', + text: 'Engagement already published. Please be careful while editing the survey.', }), ); } @@ -410,12 +410,8 @@ const SurveyFormBuilder = () => {
- - {'Save & Continue'} + + {'Report Settings'} navigate('/surveys')}>Cancel diff --git a/met-web/src/components/survey/listing/ActionsDropDown.tsx b/met-web/src/components/survey/listing/ActionsDropDown.tsx index 0841ee1c5..61b9a08e5 100644 --- a/met-web/src/components/survey/listing/ActionsDropDown.tsx +++ b/met-web/src/components/survey/listing/ActionsDropDown.tsx @@ -20,10 +20,11 @@ export const ActionsDropDown = ({ survey }: { survey: Survey }) => { const engagementId = engagement?.id ?? 0; const submissionHasBeenOpened = !!engagement && [SubmissionStatus.Open, SubmissionStatus.Closed].includes(engagement.submission_status); + const submissionIsClosed = !!engagement && [SubmissionStatus.Closed].includes(engagement.submission_status); const isEngagementDraft = !!engagement && engagement.engagement_status.id === EngagementStatus.Draft; const canEditSurvey = (): boolean => { - if (submissionHasBeenOpened) { + if (submissionIsClosed) { return false; } diff --git a/met-web/src/components/survey/report/SettingsForm.tsx b/met-web/src/components/survey/report/SettingsForm.tsx index 24515a4a1..354bacd9d 100644 --- a/met-web/src/components/survey/report/SettingsForm.tsx +++ b/met-web/src/components/survey/report/SettingsForm.tsx @@ -1,5 +1,6 @@ import React, { useContext, useState } from 'react'; -import { ClickAwayListener, Grid, InputAdornment, TextField, Tooltip } from '@mui/material'; +import { useNavigate } from 'react-router-dom'; +import { ClickAwayListener, Grid, Stack, InputAdornment, TextField, Tooltip } from '@mui/material'; import { MetHeader3, MetLabel, @@ -18,6 +19,8 @@ const SettingsForm = () => { const { setSavingSettings, savingSettings, engagementSlug, loadingEngagementSlug, survey } = useContext(ReportSettingsContext); + const navigate = useNavigate(); + const [copyTooltip, setCopyTooltip] = useState(false); const baseUrl = getBaseUrl(); @@ -111,13 +114,18 @@ const SettingsForm = () => { - setSavingSettings(true)} - loading={savingSettings} - > - Save - + + setSavingSettings(true)} + loading={savingSettings} + > + Save + + navigate(`/surveys/${survey?.id}/build`)}> + Back + + diff --git a/met-web/src/services/commentService/index.tsx b/met-web/src/services/commentService/index.tsx index b079db233..246b912a5 100644 --- a/met-web/src/services/commentService/index.tsx +++ b/met-web/src/services/commentService/index.tsx @@ -44,8 +44,9 @@ export const getStaffCommentSheet = async ({ survey_id }: GenerateCommentsSheetP export const getProponentCommentSheet = async ({ survey_id }: GenerateCommentsSheetParams) => { const url = replaceUrl(Endpoints.Comment.GET_PROPONENT_SPREAD_SHEET, 'survey_id', String(survey_id)); + const responseType = 'arraybuffer'; const headers = { - 'Content-type': 'text/csv; charset=utf-8', + 'Content-type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }; - return http.GetRequest(url, {}, headers); + return http.GetRequest(url, {}, headers, responseType); }; diff --git a/openshift/api.dc.yml b/openshift/api.dc.yml index e94e8a9a1..fed696112 100644 --- a/openshift/api.dc.yml +++ b/openshift/api.dc.yml @@ -206,7 +206,8 @@ objects: SITE_URL: ${SITE_URL} VERIFICATION_EMAIL_TEMPLATE_ID: ${VERIFICATION_EMAIL_TEMPLATE_ID} SUBSCRIBE_EMAIL_TEMPLATE_ID: ${SUBSCRIBE_EMAIL_TEMPLATE_ID} - REJECTED_EMAIL_TEMPLATE_ID: ${REJECTED_EMAIL_TEMPLATE_ID} + REJECTED_EMAIL_TEMPLATE_ID: ${REJECTED_EMAIL_TEMPLATE_ID} + CLOSED_ENGAGEMENT_REJECTED_EMAIL_TEMPLATE_ID: ${CLOSED_ENGAGEMENT_REJECTED_EMAIL_TEMPLATE_ID} ACCESS_REQUEST_EMAIL_TEMPLATE_ID: ${ACCESS_REQUEST_EMAIL_TEMPLATE_ID} KEYCLOAK_REALMNAME: ${KEYCLOAK_REALMNAME} KEYCLOAK_BASE_URL: ${KEYCLOAK_BASE_URL} @@ -272,6 +273,10 @@ parameters: description: "The rejected comment email template id" required: true value: '8410c055-587b-4788-bd2f-b563562bcb2d' + - name: CLOSED_ENGAGEMENT_REJECTED_EMAIL_TEMPLATE_ID + description: "The rejected comment email template id for closed engagement" + required: true + value: 'e942dea1-094e-4021-9aac-21a0ac1f240d' - name: ACCESS_REQUEST_EMAIL_TEMPLATE_ID description: "The access request email template id" required: true