diff --git a/.env b/.env new file mode 100644 index 0000000000..341dd7d012 --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +## GUARDIAN ECOSYSTEM ENVIRONMENT NAME +# if you already started to use actively Guardian leave GUARDIAN_ENV empty when you want to use it as usual +# if you want to use a new environment configure GUARDIAN_ENV with a significative environment name +GUARDIAN_ENV="" diff --git a/.env.example b/.env.example deleted file mode 100644 index 70954594c0..0000000000 --- a/.env.example +++ /dev/null @@ -1,14 +0,0 @@ -# guardian service -OPERATOR_ID="..." -OPERATOR_KEY="..." -SCHEMA_TOPIC_ID="..." -HEDERA_NET="testnet" -INITIALIZATION_TOPIC_ID="0.0.2030" -MESSAGE_LANG="en-US" -LOG_LEVEL="2" -MAX_TRANSACTION_FEE="20" -INITIAL_BALANCE="30" -INITIAL_STANDARD_REGISTRY_BALANCE=100 - -# IPFS -IPFS_STORAGE_API_KEY="..." diff --git a/.env.template b/.env.template new file mode 100644 index 0000000000..341dd7d012 --- /dev/null +++ b/.env.template @@ -0,0 +1,4 @@ +## GUARDIAN ECOSYSTEM ENVIRONMENT NAME +# if you already started to use actively Guardian leave GUARDIAN_ENV empty when you want to use it as usual +# if you want to use a new environment configure GUARDIAN_ENV with a significative environment name +GUARDIAN_ENV="" diff --git a/.gitignore b/.gitignore index d45f0007c0..9d2b08eca0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.env node_modules/ dist/ .vscode/ @@ -16,6 +17,7 @@ tsconfig.tsbuildinfo .pnp.* node_modules runtime-data/ +000_* # OSX related metadata removal and IDE nonsense .DS_store diff --git a/Makefile.justCOMPILE b/Makefile.justCOMPILE new file mode 100644 index 0000000000..bdd06cc22e --- /dev/null +++ b/Makefile.justCOMPILE @@ -0,0 +1,12 @@ +guardian_build: + cd interfaces && npm install && npm run build --prod + cd common && npm install && npm run build --prod + cd logger-service && npm install && npm run build --prod + cd api-gateway && npm install && npm run build --prod + cd auth-service && npm install && npm run build --prod + cd worker-service && npm install && npm run build --prod + cd guardian-service && npm install && npm run build --prod + cd policy-service && npm install && npm run build --prod + cd topic-viewer && npm install && npm run build --prod + cd mrv-sender && npm install && npm run build --prod + cd frontend && npm install && export NODE_OPTIONS=--openssl-legacy-provider && npm run build --prod diff --git a/Methodology Library/CDM/CDM.policy b/Methodology Library/CDM/CDM.policy new file mode 100644 index 0000000000..df77e34614 Binary files /dev/null and b/Methodology Library/CDM/CDM.policy differ diff --git a/Methodology Library/CDM/readme.md b/Methodology Library/CDM/readme.md new file mode 100644 index 0000000000..baf1add063 --- /dev/null +++ b/Methodology Library/CDM/readme.md @@ -0,0 +1,23 @@ +## CDM AR-ACM0003: Methodology for Afforestation and Reforestation of Lands Except Wetlands + +**Policy Description**: + +The CDM AR-ACM0003 methodology is a comprehensive framework developed under the Clean Development Mechanism (CDM) to guide afforestation and reforestation projects aimed at combating climate change and promoting sustainable land use practices. This methodology facilitates the identification of suitable project sites, establishes baselines for measuring greenhouse gas emissions, ensures the additionality of emissions reductions, implements robust monitoring and reporting systems, addresses leakage and permanence concerns, and seeks validation and certification from accredited entities. By adhering to this methodology, projects can effectively sequester carbon dioxide, conserve biodiversity, provide ecosystem services, and generate socio-economic co-benefits, contributing to global climate change mitigation and sustainable development goals. + +The Guardian policy for afforestation and reforestation of lands except wetlands (AR-ACM0003) incorporates schemas for project details, baseline scenario GHG removals, project scenario GHG removals, project scenario emissions, and leakage. These schemas provide a structured framework for site selection, emissions quantification, and monitoring procedures. + +**Workflow Description**: + +The workflow for the afforestation and reforestation of lands except wetlands (AR-ACM0003) Guardian policy involves the Project Proponent preparing and submitting the project description, which is then reviewed and approved by the Designated National Authority (DNA). The UNFCCC Secretariat adds the approved project to the project pipeline and registry. The Project Proponent conducts monitoring and submits the monitoring report to the Designated Operational Entity (VVB) for assessment and validation. Upon certification by the VVB, the UNFCCC Secretariat reviews the project and issues Certified Emission Reductions (CERs). + +image + +**Note** : +For Demo purpose, we have uploaded CDM Policy into IPFS and created Timestamps, which are mentioned in the below table. + +**Verra REDD Versions and their IPFS timestamps:** + +| Version | IPFS Timestamp | Policy File Link | Version Differences | +|---|---|---|---:| +| CDM AR-ACM0003 | 1684768427.831434003 | [Link](https://github.com/hashgraph/guardian/blob/main/Methodology%20Library/CDM/CDM.policy) | CDM AR-ACM0003 Methodology | + diff --git a/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - Agent Application Subpolicy.policy b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - Agent Application Subpolicy.policy new file mode 100644 index 0000000000..92fdb53efa Binary files /dev/null and b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - Agent Application Subpolicy.policy differ diff --git a/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - MR Verification Subpolicy.policy b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - MR Verification Subpolicy.policy new file mode 100644 index 0000000000..57920cad99 Binary files /dev/null and b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - MR Verification Subpolicy.policy differ diff --git a/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - PDD Validation Subpolicy.policy b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - PDD Validation Subpolicy.policy new file mode 100644 index 0000000000..57e9f7934c Binary files /dev/null and b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy - PDD Validation Subpolicy.policy differ diff --git a/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy.policy b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy.policy new file mode 100644 index 0000000000..ad99a51830 Binary files /dev/null and b/Methodology Library/Improved CookStove/policies/Improved Cookstove Policy.policy differ diff --git a/Methodology Library/Improved CookStove/policies/policy_1666966023463.policy b/Methodology Library/Improved CookStove/policies/policy_1666966023463.policy deleted file mode 100644 index 240db45141..0000000000 Binary files a/Methodology Library/Improved CookStove/policies/policy_1666966023463.policy and /dev/null differ diff --git a/Methodology Library/Improved CookStove/readme.md b/Methodology Library/Improved CookStove/readme.md index f900f31d60..ff1c563aac 100644 --- a/Methodology Library/Improved CookStove/readme.md +++ b/Methodology Library/Improved CookStove/readme.md @@ -1,75 +1,136 @@ ## Guardian Policy for Improved Cookstoves -**Introduction**: +**Introduction** Currently, there are many different types of cookstoves and several Standards Bodies, each with their own Standard that must be followed in order to prove the quality of a given GHG emission reduction claim. This process is time and labor intensive, creating barriers to those willing to enter the market. Digitization of this manual, paper driven process is a necessary step to scaling at the speed required for climate change. The Value of Digitizing the Methodology: -Creates trust via +1. Creates trust via +- Traceability and transparency of data +- Digital quality assurance +- Immutability of data +- Transparency of Verifier credentials and approval data + +2. Reduces barriers to entry +- Accessible and standardized policies and processes inform and encourage suppliers to bring their projects to market +- Decentralized project management reduces dependency on Standards Bodies and reduces time to market. + +3. Contributes to Climate Goals +- Achieves higher confidence carbon project outcomes, and scales the finance and rollout of carbon projects at the speed required by the climate emergency + +This first of its kind Hedera Guardian Improved Cookstove Policy (ICP) was designed per the [Anthropogenic Impact Accounting Ontology](https://wiki.hyperledger.org/display/CASIG/An+ontology+for+anthropogenic+impact+accounting). To this end, the Guardian Policy does not adhere to a specific Standard or approved methodology for carbon offset quantification, rather it abstracts concepts from the most commonly used standards and methodologies, categorizes them, models their relationships, and then instantiates them in the form of this digitally native Guardian Policy and its associated Guardian Schema. This policy issues a non-fungible Improved Cookstove Carbon Credit (ICCC) Token. + +**Scope and Applicability** + +Scope: Quantification of greenhouse gas (GHG) emission reductions from improved biomass cookstoves developed by the Nova Institute and Tolam Earth, Inc. + +Applicability: Applicable to activities reducing GHG emissions from cookstoves through switching to more energy efficient stoves. + +Token: Non-Fungible + +Type: Carbon Offset + +Standard: Multiple + +Methodology: Multiple + +Required Documents: Project Design Document (PDD), PDD Validation Report, Monitoring Report, Monitoring Report Verification, Double Counting Certification, VVB Certification and Conflict of Interest Statement. See 'Preconditions' below for more detail. + +NFT Owner: The agent fulfilling the 'Project Developer' role. + +**Preconditions** + +1. Standard Registry account on a Guardian instance to import the policy and its subpolicies. See [Guardian documentation](https://docs.hedera.com/guardian/policy-creation-using-the-guardian-apis/prerequesite-steps) for steps to create an account and import a policy. +2. User accounts within the Guardian to fill the roles defined in the policy and its subpolicies. +3. Required Project Documentation posted to traceable, immutable source which can be accessed by the Tolam Earth Marketplace. +4. To fulfil the Project Developer role (see 'Roles' below for details), an agent must obtain an HGICP Project Developer License (HGICP-L-PD) from the ICP Agent Application Subpolicy. +5. To fulfil the PDD Validator role, an agent must obtain an HGICP PDD Validator License (HGICP-L-PV) from the ICP Agent Application Subpolicy. +6. To fulfil the MR Verifier role, an agent must obtain an HGICP MR Verifier License (HGICP-L-MV) form the ICP Agent Application Subpolicy. +7. In addition to an HGICP-L-PD, a Project Developer will need to obtain an HGICP PDD Validation Certificate (HGICP-VCERT-PDD, issued by the ICP PDD Validation Subpolicy) to complete the project registration step of the main policy. To apply for an ICCC issuance, a Project Developer will furthermore need to obtain an HGICP MR Verification Certificate (HGICP-VCERT-MR, issued by the ICP MR Verification Subpolicy). + +Testnet message IDs: +- Improved Cookstove Policy (main): 1676641566.153212434 +- Improved Cookstove Policy - Agent Application Subpolicy: 1676640723.598879583 +- Improved Cookstove Policy - PDD Validation Subpolicy: 1676641042.365033796 +- Improved Cookstove Policy - MR Verification Subpolicy: 1676641311.452316505 + +**Policy User Roles** + +Improved Cookstove Policy (main): +1. Project Developer (PROJECT_DEVELOPER): Person responsible for executing the Project Design and collecting Data as per the Project Application. The Project Developer submits Monitoring Reports and is the beneficiary of the Credit Claims. +2. Public Viewer (VIEWER): Any member of the public who wishes to view the Guardian TrustChain for a specific ICCC issuance. +3. Standard Body (OWNER): Administrative role that approves Verifiers, approves Project Applications, and manages the issuance of claims. + +Improved Cookstove Policy - Agent Application Subpolicy: +1. (Anyone): Any person or legal entity who wishes to fulfil one or more of the following ICP roles: +- Project Developer (in any of the four policies) +- PDD Validator (in the PDD Validation Subpolicy) +- MR Verifier (in the MR Verification Subpolicy) +2. Standard Body (OWNER): See Improved Cookstove Policy (main). + +Improved Cookstove Policy - PDD Validation Subpolicy: +1. Project Developer (PROJECT_DEVELOPER): See Improved Cookstove Policy (main). +2. Validator (VALIDATOR): An agent who validates Project Designs by reviewing Project Design Documents. +3. Public Viewer: Not yet implemented. + +Improved Cookstove Policy - MR Verification Subpolicy: +1. Project Developer (PROJECT_DEVELOPER): See Improved Cookstove Policy (main). +2. Verifier (VERIFIER): Approved, independent person or organization that verifies Claims Data in the form of Monitoring Reports. +3. Public Viewer: Not yet implemented. + +**Schema** + +Improved Cookstove Policy (main): +- Presentation Request: Role License (PR-RL) +- Project Listing Application (PLA) +- Document Review: Project Listing Application (DR-PLA) +- Project Registration Request (PRR) +- HGICV Token Issuance Request (TIR) + +ICP Agent Application Subpolicy: +- Role Application (RA) +- Agent Details (AD) + +ICP PDD Validation Subpolicy: +- Presentation Request: Role License (PR-RL) +- PDD Section A - Description of Project (PDD-XA) +- Document Review: PDD Section A (DR-PDD-XA) +- PDD Section B - Methodologies (PDD-XB) +- Document Review: PDD Section B (DR-PDD-XB) +- PDD Section C - Crediting Period (PDD-XC) +- Document Review: PDD Section C (DR-PDD-XC) +- PDD Section D - Other Impacts (PDD-XD) +- Document Review: PDD Section D (DR-PDD-XD) +- PDD Section E - Stakeholder Engagement (PDD-XE) +- Document Review: PDD Section E (DR-PDD-XE) +- Project Design Document (PDD) +- Location +- GeoCoordinate +- GeoLine +- GeoPolygon +- Technology or Measure +- Project Party +- Table: Project Boundary +- Table Row: Project Boundary +- Emission Reduction Calculation +- Table Row: Data/Parameter Monitoring +- Table Row: Ex Ante Emissions Estimations +- Monitoring Plan + +ICP MR Verification Subpolicy: +- Presentation Request: Role License (PR-RL) +- Monitoring Report (MR) +- Table Row: Data/Parameter Monitoring +- Document Review: Monitoring Report (DR-MR) + +**Workflow** + +![Table showing the workflows of the Improved Cookstove Policy and its subpolicies](https://bafybeib4ms5lkfbcccbpc6tlcs3cilsiqmgszld7mlndllg653ywjhvzyu.ipfs.w3s.link/PolicyWorkflow.png) + +**Glossary** -● Traceability and transparency of data - -● Digital quality assurance - -● Immutability of data - -● Transparency of Verifier credentials and approval data - -Reduces barriers to entry - -● Accessible and standardized policies and processes inform and encourage suppliers to bring their projects to market - -● Decentralized project management reduces dependency on Standards Bodies and reduces time to market. - -Contributes to Climate Goals - -● Achieves higher confidence carbon project outcomes, and scales the finance and rollout of carbon projects at the speed required by the climate emergency - -This first of its kind Improved Cookstove Guardian Policy was designed per the Anthropogenic Impact Accounting Ontology found here An ontology for anthropogenic impact accounting. To this end, the Guardian Policy does not adhere to a specific Standard or approved methodology for carbon offset quantification, rather it abstracts concepts from all known standards and methodologies, categorizes them, models their relationships, and then instantiates them in the form of this digitally native Guardian Policy and its associated Guardian Schema. This policy issues a non fungible Improved Cookstove Carbon Credit (ICCC) Token. - -**Scope and Applicability**: - -Guardian implementation of a digitally native methodology for quantifying greenhouse gas (GHG) emission reductions from improved biomass cookstoves developed by the Nova Institute and Tolam Earth, Inc. - - -Applicable to activities reducing GHG emissions from cookstoves: - -1. Through switching to more efficient stove technology - -Token: Non-Fungible Type: Carbon Offset Standard: Multiple Methodology: Multiple - -Required Documents: Project Design Document (PDD), PDD Validation Report, Monitoring Report, Monitoring Report Verification, Double Counting Certification, - -VVB Certification and Conflict of Interest Statement - -NFT Owner: - -**Preconditions**: -1. Standard Registry account on a Guardian instance to import the policy. See Guardian documentation at - (https://docs.hedera.com/guardian/policy-creation-using-the-guardian-apis/prerequesite- - steps) for steps to create an account and import a policy. -2. User accounts within the Guardian to fill the roles defined in this policy. -3. Required Project Documentation posted to traceable, immutable source which can be accessed by the Tolam Earth Marketplace. - -**Policy User Roles**: -1. Project Developer: Person responsible for executing the Project Design and collecting Data as per the Project Application. The Project Developer submits Monitoring Reports and is the beneficiary of the Credit Claims. -2. Verifier: Approved, independent person or organization that Verifies the Project Application and Claims Data in the form of Monitoring Reports. -3. Standard Body: Administrative role that approves Verifiers, approves Project Applications, and manages the issuance of claims. - -**Schema**: - -1. Agent Application (AA) -2. Project Listing Application (PLA) -3. Project Listing Application (PLA) - Review -4. Project Design Document (PDD) -5. Project Design Document (PDD) - Review -6. Project Registration Request (PRR) -7. Monitoring Report (MR) -8. Monitoring Report (MR) - Review -9. ICCC Issuance Request (CIR) - -**Glossary**: +Claim: The end result of execution of a project, often expressed per unit time, which quantifies the impact of the initiative. Guardian: The Guardian is a modular open-source solution that includes best-in-class identity management and Decentralized Ledger Technology (DLT) libraries. At the heart of the Guardian solution is a sophisticated Policy Workflow Engine (PWE) that enables applications to offer a requirements-based tokenization implementation. @@ -77,22 +138,18 @@ Guardian Policy: Defines activities, rules, and interactions between activities Guardian Schema: Describes the structure and definition of data fields required within an activity, sub-activity, or sub-sub-activity. Essentially, the schema defines the data fields that must be supplied for each activity and the characteristics of those fields. -Standard: Set of project design, monitoring, and reporting criteria against which activities’ impacts can be certified or verified, e.g. Greenhouse Gas (GHG) emission reductions, or social benefits. - -Standards Body: Organization which defines the standard and approves project design, monitoring, and reporting criteria within it. - Methodology: As part of a Standard, Methodologies define the rules for calculating emissions increase, footprint, reductions and/or removals. -Project Documentation: Any documentation required by the Guardian Schema. This may include Monitoring Reports, Project Design Documents, Verifier Credentials, etc. +Monitoring Report: Document that describes and justifies any changes to the Project Design Document, based upon what happened during execution of a project. Also includes any data and/or calculations made during the time period covered by the document. A single project can have multiple Monitoring Reports associated with it, and each Monitoring Report is associated with a Claim. Project Design Document: Documentation of plans for an activity to be executed following the prescriptions of the Standard in a concrete context for generation of assets. +Project Documentation: Any documentation required by the Guardian Schema. This may include Monitoring Reports, Project Design Documents, Verifier Credentials, etc. + Project Listing Application: Process during which a Project Developer expresses their intent to develop a (cookstove) project towards a specific Registry, and the Registry then acknowledges that intent by assigning a project code to the project and listing it in the Registry’s public database of projects. Project Registration: When Project Design Documents are approved by a Registry. +Standard: Set of project design, monitoring, and reporting criteria against which activities’ impacts can be certified or verified, e.g. Greenhouse Gas (GHG) emission reductions, or social benefits. -**Monitoring Report**: - -Document that describes and justifies any changes to the Project Design Document, based upon what happened during execution of a project. Also includes any data and/or calculations made during the time period covered by the document. A single project can have multiple Monitoring Reports associated, and each Monitoring Report is associated with a Claim. -Claim: The end result of execution of a project, often expressed per unit time, which quantifies the impact of the initiative. +Standards Body: Organization which defines the standard and approves project design, monitoring, and reporting criteria within it. diff --git a/Methodology Library/iREC/Policies/iRec 10 Recipient (1684757087.809526003).policy b/Methodology Library/iREC/Policies/iRec 10 Recipient (1684757087.809526003).policy new file mode 100644 index 0000000000..367af71f37 Binary files /dev/null and b/Methodology Library/iREC/Policies/iRec 10 Recipient (1684757087.809526003).policy differ diff --git a/Methodology Library/iREC/Policies/iRec 10 Source (1684756995.238994037).policy b/Methodology Library/iREC/Policies/iRec 10 Source (1684756995.238994037).policy new file mode 100644 index 0000000000..d5b6ef62f5 Binary files /dev/null and b/Methodology Library/iREC/Policies/iRec 10 Source (1684756995.238994037).policy differ diff --git a/README.md b/README.md index 5c86856e57..824662d601 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ When building the reference implementation, you can [manually build every compon * [Docker](https://www.docker.com) -If you build with docker [MongoDB V6](https://www.mongodb.com), [NodeJS V16](https://nodejs.org) and [Nats 1.12.2](https://nats.io/) will be installed and configured automatically. Make sure you use Docker Compose V2 (comes with Docker Desktop > 3.6.0) as at https://docs.docker.com/compose/install/ +If you build with docker [MongoDB V6](https://www.mongodb.com), [NodeJS V16](https://nodejs.org) and [Nats 1.12.2](https://nats.io/) will be installed and configured automatically. ### Installation @@ -47,22 +47,20 @@ If you build with docker [MongoDB V6](https://www.mongodb.com), [NodeJS V16](htt git clone https://github.com/hashgraph/guardian.git ``` -2. Update the following files with your Hedera Testnet account info (see prerequisites) as indicated. Please check complete steps to generate Operation ID and Operator Key by looking at link : [How to Create Operator ID and Operator Key](https://docs.hedera.com/guardian/getting-started/getting-started/how-to-create-operator-id-and-operator-key). There will be other steps in the Demo Usage Guide that will require the generation of Operator IDs and Operator Keys. It is important to mention that the Operator IDs and Operator Keys in the .env will be used to generate demo accounts. +2. Update the following files with your Hedera Testnet account info (see prerequisites) as indicated. Please check complete steps to generate Operation ID and Operator Key by looking at link : [How to Create Operator ID and Operator Key](https://docs.hedera.com/guardian/getting-started/getting-started/how-to-create-operator-id-and-operator-key). There will be other steps in the Demo Usage Guide that will require the generation of Operator IDs and Operator Keys. It is important to mention that the Operator IDs and Operator Keys in the ./guardian/configs/.env.\.guardian.system will be used to generate demo accounts. For example: - in `guardian-service/.env`: - + in ./guardian/.env you may choose name of the Guardian platform. Leave the field empty or unspecified if you update a production environment to keep previous data (for more details read at https://github.com/IntellectEU/guardian/blob/feature/environment/docs/environments/Ecosystem-Envitonment.md) ```plaintext - OPERATOR_ID="" - OPERATOR_KEY="" + GUARDIAN_ENV="develop" ``` - - in `guardian-service/.env.docker`: + + in ./guardian/configs/.env.develop.guardian.system ```plaintext - OPERATOR_ID="" - OPERATOR_KEY="" + OPERATOR_ID="..." + OPERATOR_KEY="..." ``` **Note**. You can use the Schema Topic ID (`INITIALIZATION_TOPIC_ID`) already present in the configuration files, or you can specify your own. @@ -71,24 +69,24 @@ If you build with docker [MongoDB V6](https://www.mongodb.com), [NodeJS V16](htt **3.1 Setting up IPFS Local node:** - 3.1.1 We need to install and configure any IPFS node. + - 3.1.1 We need to install and configure any IPFS node. For example: https://github.com/yeasy/docker-ipfs - 3.1.2 For setup IPFS local node you need to set variables in `worker-service` folder + - 3.1.2 For setup IPFS local node you need to set variables in the same file ./guardian/configs/.env.develop.guardian.system ``` IPFS_NODE_ADDRESS="..." # Default IPFS_NODE_ADDRESS="http://localhost:5002" - IPFS_PUBLIC_GATEWAY="..." # Default IPFS_PUBLIC_GATEWAY="https://localhost:8080/ipfs/${cid}" + IPFS_PUBLIC_GATEWAY='...' # Default IPFS_PUBLIC_GATEWAY='https://localhost:8080/ipfs/${cid}' IPFS_PROVIDER="local" ``` **Note** 1. Default IPFS_NODE_ADDRESS="http://localhost:5002" - 2. Default IPFS_PUBLIC_GATEWAY="https://localhost:8080/ipfs/${cid}" + 2. Default IPFS_PUBLIC_GATEWAY='https://localhost:8080/ipfs/${cid}' **3.2 Setting up IPFS Web3Storage node:** - 3.2.1 For setup IPFS web3storage node you need to set variables in `worker-service` folder: + 3.2.1 For setup IPFS web3storage node you need to set variables in the same file ./guardian/configs/.env.develop.guardian.system ``` IPFS_STORAGE_API_KEY="..." @@ -100,8 +98,10 @@ If you build with docker [MongoDB V6](https://www.mongodb.com), [NodeJS V16](htt 4. Build and launch with Docker. Please note that this build is meant to be used in production and will not contain any debug information. From the project's root folder: ```shell - docker-compose up -d --build + docker compose up -d --build ``` +**Note**. about docker-compose: from the end of June 2023 Compose V1 won’t be supported anymore and will be removed from all Docker Desktop versions. Make sure you use Docker Compose V2 (comes with Docker Desktop > 3.6.0) as at https://docs.docker.com/compose/install/ + 5. Browse to and complete the setup. @@ -118,6 +118,25 @@ If you want to manually build every component with debug information, then build ### Build and start each component Install, configure and start all the prerequisites, then build and start each component. +Configure .env file in each service + + For example: + + in `guardian-service/.env`: + ```plaintext + GUARDIAN_ENV="develop" + ``` + + If need to configure OVERRIDE variables add it in .env file. + ```plaintext + OVERRIDE="false" + ``` + + in `guardian-service/configs/.env.guardian.develop`: + ```plaintext + OPERATOR_ID="..." + OPERATOR_KEY="..." + ``` **Note: Once you start each service, please wait for the initialization process to be completed.** @@ -329,7 +348,7 @@ Install, configure and start all the prerequisites, then build and start each co 2. Start local development using docker compose ```shell - docker-compose -f docker-compose-dev.yml up --build + docker compose -f docker-compose-dev.yml up --build ``` 3. Access local development using or @@ -345,7 +364,7 @@ Install, configure and start all the prerequisites, then build and start each co **To run by cleaning Docker cache**: ```shell - docker-compose build --no-cache + docker compose build --no-cache ``` ([back to top](readme)) diff --git a/api-docs/.env (1) b/api-docs/.env (1) new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api-docs/api/swagger/swagger.yaml b/api-docs/api/swagger/swagger.yaml index 60d56d26c6..f8d1af8cee 100644 --- a/api-docs/api/swagger/swagger.yaml +++ b/api-docs/api/swagger/swagger.yaml @@ -2,7 +2,7 @@ openapi: 3.0.0 info: title: "Guardian" description: "The Guardian is a modular open-source solution that includes best-in-class identity management and decentralized ledger technology (DLT) libraries. At the heart of the Guardian solution is a sophisticated Policy Workflow Engine (PWE) that enables applications to offer a requirements-based tokenization implementation." - version: "2.12.0" + version: "2.13.0" contact: name: "API developer" url: "https://envisionblockchain.com" @@ -848,6 +848,90 @@ components: items: type: string example: ["type"] + WizardConfig: + type: object + required: + - policy + - roles + - schemas + - trustChain + properties: + roles: + type: array + items: + type: string + policy: + type: object + properties: + name: + type: string + description: + type: string + topicDescription: + type: string + policyTag: + type: string + schemas: + type: array + items: + type: object + properties: + name: + type: string + iri: + type: string + isApproveEnable: + type: boolean + isMintSchema: + type: boolean + mintOptions: + type: object + properties: + tokenId: + type: string + rule: + type: string + dependencySchemaIri: + type: string + relationshipsSchemaIri: + type: string + initialRolesFor: + type: array + items: + type: string + rolesConfig: + type: array + items: + type: object + properties: + role: + type: string + isApprover: + type: boolean + isCreator: + type: boolean + gridColumns: + type: array + items: + type: object + properties: + field: + type: string + title: + type: string + trustChain: + type: array + items: + type: object + properties: + role: + type: string + mintSchemaIri: + type: string + viewOnlyOwnDocuments: + type: boolean + + tags: - name: "accounts" description: "Operations related to Guardian users" @@ -859,7 +943,7 @@ tags: description: "Operations with data schemas" - name: "tokens" description: "Everything about tokens" - - name: "trustchains" + - name: "trust-chains" description: "Audit and trust chain" - name: "policies" description: "Policy engine operations" @@ -887,6 +971,8 @@ tags: description: "Operations with Tags" - name: "themes" description: "Operations with Themes" + - name: "wizard" + description: "Operations with policy wizard" paths: /accounts: get: @@ -987,7 +1073,7 @@ paths: $ref: "#/components/schemas/Credentials" responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -1166,7 +1252,7 @@ paths: $ref: "#/components/schemas/User" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -1331,7 +1417,7 @@ paths: $ref: "#/components/schemas/Schema" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -1639,7 +1725,7 @@ paths: required: true responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -1733,7 +1819,7 @@ paths: type: string responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -2026,7 +2112,7 @@ paths: $ref: "#/components/schemas/Schema" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -2223,12 +2309,12 @@ paths: type: string enum: [ - STANDARD_REGISTRY, - USER, - POLICY, - MINT_TOKEN, - WIPE_TOKEN, - MINT_NFTOKEN, + STANDARD_REGISTRY, + USER, + POLICY, + MINT_TOKEN, + WIPE_TOKEN, + MINT_NFTOKEN, ] required: true description: schema type. @@ -2302,7 +2388,7 @@ paths: $ref: "#/components/schemas/Token" responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -2534,8 +2620,178 @@ paths: schema: $ref: "#/components/schemas/Error" + /tokens/{tokenId}/{username}/grant-kyc: + put: + tags: + - tokens + description: Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. + parameters: + - in: path + name: tokenId + schema: + type: string + required: true + description: Token ID. + - in: path + name: username + schema: + type: string + required: true + description: Username. + security: + - bearerAuth: [] + summary: Sets the KYC flag for the user. + responses: + 200: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/TokenInfo" + 400: + description: Bad Request. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /tokens/push/{tokenId}/{username}/grant-kyc: + put: + tags: + - tokens + description: Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. + security: + - bearerAuth: [] + summary: Sets the KYC flag for the user. + parameters: + - in: path + name: tokenId + schema: + type: string + required: true + description: Token ID. + - in: path + name: username + schema: + type: string + required: true + description: Username. + responses: + 202: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/Task" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /tokens/{tokenId}/{username}/revoke-kyc: + put: + tags: + - tokens + description: Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. + parameters: + - in: path + name: tokenId + schema: + type: string + required: true + description: Token ID. + - in: path + name: username + schema: + type: string + required: true + description: Username. + security: + - bearerAuth: [] + summary: Unsets the KYC flag for the user. + responses: + 200: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/TokenInfo" + 400: + description: Bad Request. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /tokens/push/{tokenId}/{username}/revoke-kyc: + put: + tags: + - tokens + description: Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. + security: + - bearerAuth: [] + summary: Unsets the KYC flag for the user. + parameters: + - in: path + name: tokenId + schema: + type: string + required: true + description: Token ID. + - in: path + name: username + schema: + type: string + required: true + description: Username. + responses: + 202: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/Task" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /tokens/{tokenId}/{username}/grantKyc: put: + deprecated: true tags: - tokens description: Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. @@ -2581,6 +2837,7 @@ paths: /tokens/push/{tokenId}/{username}/grantKyc: put: + deprecated: true tags: - tokens description: Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. @@ -2620,6 +2877,7 @@ paths: /tokens/{tokenId}/{username}/revokeKyc: put: + deprecated: true tags: - tokens description: Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. @@ -2665,6 +2923,7 @@ paths: /tokens/push/{tokenId}/{username}/revokeKyc: put: + deprecated: true tags: - tokens description: Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. @@ -2853,12 +3112,109 @@ paths: required: true description: Username. responses: - 202: + 202: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/Task" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /trustchains: + get: + deprecated: true + tags: + - trust-chains + description: Requests all VP documents. Only users with the Auditor role are allowed to make the request. + security: + - bearerAuth: [] + summary: Returns a list of all VP documents. + parameters: + - in: query + name: pageIndex + schema: + type: integer + description: The number of pages to skip before starting to collect the result set + examples: + pageIndex: + summary: Example of a pageIndex + value: 0 + - in: query + name: pageSize + schema: + type: integer + description: The numbers of items to return + examples: + pageSize: + summary: Example of a pageSize + value: 100 + - in: query + name: policyId + schema: + type: string + description: Selected policy ID. + - in: query + name: policyOwner + schema: + type: string + description: Selected Standard Registry (DID). + responses: + 200: + description: Successful operation. + headers: + x-total-count: + schema: + type: integer + description: Total items in the collection. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/VerifiablePresentation" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /trustchains/{hash}: + get: + deprecated: true + tags: + - trust-chains + description: Builds and returns a trustchain, from the VP to the root VC document. Only users with the Auditor role are allowed to make the request. + parameters: + - in: path + name: hash + schema: + type: string + required: true + description: Hash or ID of a VP document. + security: + - bearerAuth: [] + summary: Returns a trustchain for a VP document. + responses: + 200: description: Successful operation. content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/TrustChains" 401: description: Unauthorized. 403: @@ -2870,7 +3226,7 @@ paths: schema: $ref: "#/components/schemas/Error" - /trustchains: + /trust-chains: get: tags: - trustchains @@ -2932,7 +3288,7 @@ paths: schema: $ref: "#/components/schemas/Error" - /trustchains/{hash}: + /trust-chains/{hash}: get: tags: - trustchains @@ -3039,7 +3395,7 @@ paths: $ref: "#/components/schemas/PolicyConfig" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -3616,7 +3972,7 @@ paths: type: string responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -3698,7 +4054,7 @@ paths: format: binary responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -3872,8 +4228,8 @@ paths: required: true description: Policy ID. responses: - 200: - description: Successful operation. + 201: + description: Created. content: application/json: schema: @@ -4436,9 +4792,9 @@ paths: /demo/randomKey: get: + deprecated: true tags: - demo - deprecated: true description: Generates a new Hedera account with a random private key. security: - bearerAuth: [] @@ -4555,7 +4911,7 @@ paths: - bearerAuth: [] responses: 201: - description: Successful operation. + description: Created. content: binary/octet-stream: schema: @@ -4588,7 +4944,7 @@ paths: - bearerAuth: [] responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -4636,8 +4992,8 @@ paths: - bearerAuth: [] summary: Set settings. responses: - 200: - description: Successful operation. + 201: + description: Created. 401: description: Unauthorized. 403: @@ -4782,8 +5138,144 @@ paths: schema: $ref: "#/components/schemas/Error" + /artifacts: + get: + tags: + - artifacts + description: Returns all artifacts. + security: + - bearerAuth: [] + summary: Returns all artifacts. + parameters: + - in: query + name: policyId + schema: + type: string + description: Policy identifier + - in: query + name: pageIndex + schema: + type: integer + description: The number of pages to skip before starting to collect the result set + examples: + pageIndex: + summary: Example of a pageIndex + value: 0 + - in: query + name: pageSize + schema: + type: integer + description: The numbers of items to return + examples: + pageSize: + summary: Example of a pageSize + value: 100 + responses: + 200: + description: Successful operation. + headers: + x-total-count: + schema: + type: integer + description: Total items in the collection. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Artifact" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /artifacts/{policyId}: + post: + tags: + - artifacts + description: Upload artifact. For users with the Standard Registry role only. + security: + - bearerAuth: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + artifacts: + type: array + items: + type: string + format: binary + parameters: + - in: path + name: policyId + schema: + type: string + required: true + description: Policy identifier + summary: Upload Artifact. + responses: + 200: + description: Successful operation. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Artifact" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /artifacts/{artifactId}: + delete: + tags: + - artifacts + description: Delete artifact. + security: + - bearerAuth: [] + summary: Delete artifact. + parameters: + - in: path + name: artifactId + schema: + type: string + required: true + description: Artifact identifier + responses: + 200: + description: Successful operation. + content: + application/json: + schema: + type: boolean + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" /artifact: get: + deprecated: true tags: - artifacts description: Returns all artifacts. @@ -4841,6 +5333,7 @@ paths: /artifact/{policyId}: post: + deprecated: true tags: - artifacts description: Upload artifact. For users with the Standard Registry role only. @@ -4887,6 +5380,7 @@ paths: /artifact/{artifactId}: delete: + deprecated: true tags: - artifacts description: Delete artifact. @@ -4988,8 +5482,8 @@ paths: example: description: "Smart Contract Description" responses: - 200: - description: Successful operation. + 201: + description: Created. content: application/json: schema: @@ -4998,6 +5492,8 @@ paths: description: Unauthorized. 403: description: Forbidden. + 422: + description: Unprocessable Entity. 500: description: Internal server error. content: @@ -5490,7 +5986,7 @@ paths: $ref: "#/components/schemas/Module" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -5747,7 +6243,7 @@ paths: type: string responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -5781,7 +6277,7 @@ paths: format: binary responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -5940,7 +6436,7 @@ paths: $ref: "#/components/schemas/Tag" responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -5984,12 +6480,12 @@ paths: type: string enum: [ - Schema, - Policy, - Token, - Module, - Contract, - PolicyDocument, + Schema, + Policy, + Token, + Module, + Contract, + PolicyDocument, ] target: type: string @@ -6002,12 +6498,12 @@ paths: type: string enum: [ - Schema, - Policy, - Token, - Module, - Contract, - PolicyDocument, + Schema, + Policy, + Token, + Module, + Contract, + PolicyDocument, ] targets: type: array @@ -6189,7 +6685,7 @@ paths: $ref: "#/components/schemas/Schema" responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -6381,7 +6877,7 @@ paths: $ref: "#/components/schemas/Theme" responses: 201: - description: Successful operation. + description: Created. 401: description: Unauthorized. 403: @@ -6511,7 +7007,7 @@ paths: format: binary responses: 201: - description: Successful operation. + description: Created. content: application/json: schema: @@ -6526,3 +7022,119 @@ paths: application/json: schema: $ref: "#/components/schemas/Error" + + /wizard/policy: + post: + tags: + - wizard + description: Creates a new policy by wizard. Only users with the Standard Registry role are allowed to make the request. + security: + - bearerAuth: [] + summary: Creates a new policy. + requestBody: + description: Object that contains wizard configuration. + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/WizardConfig" + responses: + 201: + description: Successful operation. + content: + application/json: + schema: + type: object + properties: + policyId: + type: string + wizardConfig: + $ref: "#/components/schemas/WizardConfig" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /wizard/policy/push: + post: + tags: + - wizard + description: Creates a new policy by wizard. Only users with the Standard Registry role are allowed to make the request. + security: + - bearerAuth: [] + summary: Creates a new policy. + requestBody: + description: Object that contains wizard configuration. + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/WizardConfig" + responses: + 202: + description: Successful operation. + content: + application/json: + schema: + $ref: "#/components/schemas/Task" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /wizard/{policyId}/config: + post: + tags: + - wizard + description: Get policy config by wizard. Only users with the Standard Registry role are allowed to make the request. + parameters: + - in: path + name: policyId + schema: + type: string + required: true + description: Policy identifier. + security: + - bearerAuth: [] + summary: Get policy config. + requestBody: + description: Object that contains wizard configuration. + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/WizardConfig" + responses: + 200: + description: Successful operation. + content: + application/json: + schema: + type: object + properties: + policyConfig: + $ref: "#/components/schemas/PolicyConfig" + wizardConfig: + $ref: "#/components/schemas/WizardConfig" + 401: + description: Unauthorized. + 403: + description: Forbidden. + 500: + description: Internal server error. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" diff --git a/api-docs/package.json b/api-docs/package.json index a1c4d1b63e..e987ddc921 100644 --- a/api-docs/package.json +++ b/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "api-docs", - "version": "2.12.2", + "version": "2.13.0-prerelease", "description": "Swagger Documentation", "main": "dist/index.js", "scripts": { @@ -24,5 +24,6 @@ "@types/swagger-ui-express": "^4.1.3", "tslint": "^6.1.3", "typescript": "^4.6.3" - } + }, + "stableVersion": "2.12.0" } diff --git a/api-gateway/.env b/api-gateway/.env index 5edd71fe8b..18face0ea2 100644 --- a/api-gateway/.env +++ b/api-gateway/.env @@ -1,11 +1 @@ -ENV="develop" -HEDERA_NET="testnet" -PREUSED_HEDERA_NET="testnet" -MQ_ADDRESS="localhost" -SERVICE_CHANNEL="api-gateway" -MRV_ADDRESS="http://localhost:3003/mrv" -MQ_MAX_PAYLOAD="1048576" -#LOG_LEVEL="2" -#MQ_MESSAGE_CHUNK=5000000 -#RAW_REQUEST_LIMIT="1gb" -#JSON_REQUEST_LIMIT="1mb" +GUARDIAN_ENV="" diff --git a/api-gateway/.env.docker.example b/api-gateway/.env.docker.example deleted file mode 100644 index 1b28c61274..0000000000 --- a/api-gateway/.env.docker.example +++ /dev/null @@ -1,9 +0,0 @@ -HEDERA_NET="testnet" -PREUSED_HEDERA_NET="testnet" -MQ_ADDRESS="message-broker" -SERVICE_CHANNEL="api-gateway" -MRV_ADDRESS="http://message-broker:3003/mrv" -#LOG_LEVEL="2" -#MQ_MESSAGE_CHUNK=5000000 -#RAW_REQUEST_LIMIT="1gb" -#JSON_REQUEST_LIMIT="1mb" diff --git a/api-gateway/.env.template b/api-gateway/.env.template new file mode 100644 index 0000000000..dd4ffe0d89 --- /dev/null +++ b/api-gateway/.env.template @@ -0,0 +1,2 @@ +GUARDIAN_ENV="" +#OVVERRIDE="false" \ No newline at end of file diff --git a/api-gateway/Dockerfile b/api-gateway/Dockerfile index 89b3d072fc..cef1cbcb9f 100644 --- a/api-gateway/Dockerfile +++ b/api-gateway/Dockerfile @@ -36,7 +36,8 @@ COPY --from=interfacesModuleBuilder /usr/local/interfaces/guardian-interfaces-*. COPY --from=commonModuleBuilder /usr/local/common/guardian-common-*.tgz /tmp/common.tgz COPY --from=apiGatewayBuilder /usr/local/api-gateway/yarn.lock ./ COPY ./api-gateway/package.json ./ -# COPY ./api-gateway/.env.docker ./.env +RUN mkdir -p ./configs +COPY ./api-gateway/configs/* ./configs RUN node -e "const fs=require('fs'); const input=JSON.parse(fs.readFileSync('package.json')); input.dependencies['@guardian/interfaces']='file:/tmp/interfaces.tgz'; fs.writeFileSync('package.json', JSON.stringify(input));" RUN node -e "const fs=require('fs'); const input=JSON.parse(fs.readFileSync('package.json')); input.dependencies['@guardian/common']='file:/tmp/common.tgz'; fs.writeFileSync('package.json', JSON.stringify(input));" RUN yarn install --frozen-lockfile diff --git a/api-gateway/.env.example b/api-gateway/configs/.env.gateway similarity index 65% rename from api-gateway/.env.example rename to api-gateway/configs/.env.gateway index 5104c77e4e..9b2a565503 100644 --- a/api-gateway/.env.example +++ b/api-gateway/configs/.env.gateway @@ -1,9 +1,13 @@ -ENV="develop" +# Gateway Service Specialized Variables +SERVICE_CHANNEL="api-gateway" +DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables HEDERA_NET="testnet" PREUSED_HEDERA_NET="testnet" MQ_ADDRESS="localhost" -SERVICE_CHANNEL="api-gateway" MRV_ADDRESS="http://localhost:3003/mrv" +MQ_MAX_PAYLOAD="1048576" #LOG_LEVEL="2" #MQ_MESSAGE_CHUNK=5000000 #RAW_REQUEST_LIMIT="1gb" diff --git a/api-gateway/configs/.env.gateway.develop b/api-gateway/configs/.env.gateway.develop new file mode 100644 index 0000000000..a5b9168ebe --- /dev/null +++ b/api-gateway/configs/.env.gateway.develop @@ -0,0 +1,14 @@ +# Gateway Service Specialized Variables +SERVICE_CHANNEL="api-gateway" +#DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables +HEDERA_NET="testnet" +PREUSED_HEDERA_NET="testnet" +MQ_ADDRESS="localhost" +MRV_ADDRESS="http://localhost:3003/mrv" +MQ_MAX_PAYLOAD="1048576" +#LOG_LEVEL="2" +#MQ_MESSAGE_CHUNK=5000000 +#RAW_REQUEST_LIMIT="1gb" +#JSON_REQUEST_LIMIT="1mb" diff --git a/api-gateway/configs/.env.gateway.template b/api-gateway/configs/.env.gateway.template new file mode 100644 index 0000000000..04952e8b97 --- /dev/null +++ b/api-gateway/configs/.env.gateway.template @@ -0,0 +1,14 @@ +# Gateway Service Specialized Variables +SERVICE_CHANNEL="api-gateway" +DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables +HEDERA_NET="" +PREUSED_HEDERA_NET="" +MQ_ADDRESS="" +MRV_ADDRESS="" +MQ_MAX_PAYLOAD="" +#LOG_LEVEL="2" +#MQ_MESSAGE_CHUNK=5000000 +#RAW_REQUEST_LIMIT="1gb" +#JSON_REQUEST_LIMIT="1mb" diff --git a/api-gateway/package.json b/api-gateway/package.json index 815bb0db02..8f7190f0d6 100644 --- a/api-gateway/package.json +++ b/api-gateway/package.json @@ -8,9 +8,15 @@ }, "author": "Envision Blockchain Solutions ", "dependencies": { - "@guardian/common": "^2.12.2", - "@guardian/interfaces": "^2.12.2", + "@guardian/common": "^2.13.0-prerelease", + "@guardian/interfaces": "^2.13.0-prerelease", + "@nestjs/common": "^9.4.1", + "@nestjs/core": "^9.4.1", + "@nestjs/microservices": "^9.4.1", + "@nestjs/platform-express": "^9.4.2", "@types/express-fileupload": "^1.4.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", "dotenv": "^16.0.0", "express": "^4.17.1", "express-fileupload": "^1.4.0", @@ -18,6 +24,8 @@ "http-errors": "^2.0.0", "jszip": "^3.7.1", "module-alias": "^2.2.2", + "prom-client": "^14.1.1", + "prometheus-api-metrics": "3.2.2", "reflect-metadata": "^0.1.13", "ws": "^8.2.1", "yup": "^1.1.1" @@ -55,5 +63,6 @@ "start": "node dist/index.js", "test": "mocha tests/**/*.test.js --reporter mocha-junit-reporter --reporter-options mochaFile=../test_results/ui-service.xml" }, - "version": "2.12.2" + "version": "2.13.0-prerelease", + "stableVersion": "2.12.0" } diff --git a/api-gateway/src/api/service/account.ts b/api-gateway/src/api/service/account.ts index 56b2d1835c..415e455239 100644 --- a/api-gateway/src/api/service/account.ts +++ b/api-gateway/src/api/service/account.ts @@ -1,117 +1,154 @@ -import { Request, Response, Router, NextFunction } from 'express'; -import { permissionHelper, authorizationHelper } from '@auth/authorization-helper'; import { Users } from '@helpers/users'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; import { UserRole } from '@guardian/interfaces'; -import validate, { prepareValidationResponse } from '@middlewares/validation'; -import { registerSchema, loginSchema } from '@middlewares/validation/schemas/accounts'; +import { ClientProxy } from '@nestjs/microservices'; +import { Body, Controller, Get, Headers, HttpCode, HttpException, HttpStatus, Inject, Post, Req } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; +import { LoginUserDTO, RegisterUserDTO } from '@middlewares/validation/schemas/accounts'; /** * User account route */ -export const accountAPI = Router(); +@Controller('accounts') +export class AccountApi { -accountAPI.get('/session', authorizationHelper, async (req: Request, res: Response, next: NextFunction) => { - const users = new Users(); - try { - const authHeader = req.headers.authorization; - const token = authHeader.split(' ')[1]; - res.json(await users.getUserByToken(token)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + constructor(@Inject('GUARDIANS') public readonly client: ClientProxy) { } -}); -accountAPI.post('/register', validate(registerSchema()),async (req: Request, res: Response, next: NextFunction) => { - const users = new Users(); - try { - const { username, password } = req.body; - let { role } = req.body; - // @deprecated 2022-10-01 - if (role === 'ROOT_AUTHORITY') { - role = UserRole.STANDARD_REGISTRY; - } - res.status(201).json(await users.registerNewUser(username, password, role)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error.message.includes('already exists')) { - return res.status(422).json(prepareValidationResponse('An account with the same name already exists.')); + /** + * getSession + * @param headers + */ + @Get('/session') + @HttpCode(HttpStatus.OK) + async getSession(@Headers() headers): Promise { + const users = new Users(); + try { + const authHeader = headers.authorization; + const token = authHeader.split(' ')[1]; + return await users.getUserByToken(token); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - next(error) - } -}); -accountAPI.post('/login', validate(loginSchema()), async (req: Request, res: Response, next: NextFunction) => { - const users = new Users(); - try { - const { username, password } = req.body; - res.json(await users.generateNewToken(username, password)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - next(error) } -}); -accountAPI.get('/', [authorizationHelper, permissionHelper(UserRole.STANDARD_REGISTRY)], - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { + /** + * register + * @param body + */ + @Post('/register') + @HttpCode(HttpStatus.CREATED) + async register(@Body() body: RegisterUserDTO): Promise { const users = new Users(); - res.json(await users.getAllUserAccounts()); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - next(error) + try { + const {username, password} = body; + let {role} = body; + // @deprecated 2022-10-01 + if (role === 'ROOT_AUTHORITY') { + role = UserRole.STANDARD_REGISTRY; + } + return await users.registerNewUser(username, password, role); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error.message.includes('already exists')) { + throw new HttpException('An account with the same name already exists.', HttpStatus.INTERNAL_SERVER_ERROR); + } + throw error; + } } -}); -/** - * @deprecated 2022-10-01 - */ -accountAPI.get('/root-authorities', authorizationHelper, async (req: Request, res: Response, next: NextFunction) => { - try { + /** + * Login + */ + @Post('/login') + @HttpCode(HttpStatus.OK) + async login(@Body() body: LoginUserDTO): Promise { const users = new Users(); - const standardRegistries = await users.getAllStandardRegistryAccounts(); - res.json(standardRegistries); - } catch (error) { - new Logger().error(error.message, ['API_GATEWAY']); - return next(error) + try { + const {username, password} = body; + return await users.generateNewToken(username, password); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -accountAPI.get('/standard-registries', authorizationHelper, async (req: Request, res: Response, next: NextFunction) => { - try { - const users = new Users(); - const standardRegistries = await users.getAllStandardRegistryAccounts(); - res.json(standardRegistries); - } catch (error) { - new Logger().error(error.message, ['API_GATEWAY']); - return next(error); + /** + * Accounts + */ + @Get() + @HttpCode(HttpStatus.OK) + async getAllAccounts(@Req() req): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const users = new Users(); + return await users.getAllUserAccounts(); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -accountAPI.get('/balance', authorizationHelper, async (req: Request, res: Response, next: NextFunction) => { - try { - const authHeader = req.headers.authorization; - const users = new Users(); - if (authHeader) { - const token = authHeader.split(' ')[1]; - try { - const user = await users.getUserByToken(token) as any; - if (user) { - const guardians = new Guardians(); - const balance = await guardians.getBalance(user.username); - return res.json(balance); - } - return res.json({}); + /** + * Get root authorities + * @deprecated 2022-10-01 + */ + @Get('/root-authorities') + @HttpCode(HttpStatus.OK) + async getRootAuthorities(): Promise { + try { + const users = new Users(); + return await users.getAllStandardRegistryAccounts(); + } catch (error) { + new Logger().error(error.message, ['API_GATEWAY']); + throw error; + } + } - } catch (error) { - return res.json({}); + /** + * Get SAs + */ + @Get('/standard-registries') + @HttpCode(HttpStatus.OK) + async getStandatdRegistries(): Promise { + try { + const users = new Users(); + return await users.getAllStandardRegistryAccounts(); + } catch (error) { + new Logger().error(error.message, ['API_GATEWAY']); + throw error; + } + } + + @Get('/balance') + @HttpCode(HttpStatus.OK) + async getBalance(@Headers() headers): Promise { + try { + const authHeader = headers.authorization; + const users = new Users(); + if (authHeader) { + const token = authHeader.split(' ')[1]; + try { + const user = await users.getUserByToken(token) as any; + if (user) { + const guardians = new Guardians(); + return await guardians.getBalance(user.username); + // const balance = await this.client.send(MessageAPI.GET_BALANCE, { username: user.username }).toPromise() + // return balance; + } + return {}; + + } catch (error) { + return {}; + } } + return {}; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - res.json({}); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) } -}); +} diff --git a/api-gateway/src/api/service/analytics.ts b/api-gateway/src/api/service/analytics.ts index a2fde30608..2a8a669a2b 100644 --- a/api-gateway/src/api/service/analytics.ts +++ b/api-gateway/src/api/service/analytics.ts @@ -1,94 +1,111 @@ import { Guardians } from '@helpers/guardians'; -import { Response, Router, NextFunction } from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; +import { Body, Controller, HttpCode, HttpStatus, Post, Req } from '@nestjs/common'; -/** - * User analytics route - */ -export const analyticsAPI = Router(); - -analyticsAPI.post('/compare/policies', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardians = new Guardians(); - const policyId1 = req.body ? req.body.policyId1 : null; - const policyId2 = req.body ? req.body.policyId2 : null; - const eventsLvl = req.body ? req.body.eventsLvl : null; - const propLvl = req.body ? req.body.propLvl : null; - const childrenLvl = req.body ? req.body.childrenLvl : null; - const idLvl = req.body ? req.body.idLvl : null; - const user = req.user; - try { - const result = await guardians.comparePolicies( - user, - null, - policyId1, - policyId2, - eventsLvl, - propLvl, - childrenLvl, - idLvl - ); - res.send(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); +@Controller('analytics') +export class AnalyticsApi { + @Post('/compare/policies') + @HttpCode(HttpStatus.OK) + async comparePolicies(@Body() body, @Req() req): Promise { + const guardians = new Guardians(); + const policyId1 = body ? body.policyId1 : null; + const policyId2 = body ? body.policyId2 : null; + const eventsLvl = body ? body.eventsLvl : null; + const propLvl = body ? body.propLvl : null; + const childrenLvl = body ? body.childrenLvl : null; + const idLvl = body ? body.idLvl : null; + const user = req.user; + try { + const result = await guardians.comparePolicies( + user, + null, + policyId1, + policyId2, + eventsLvl, + propLvl, + childrenLvl, + idLvl + ); + return result; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -analyticsAPI.post('/compare/schemas', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardians = new Guardians(); - const schemaId1 = req.body ? req.body.schemaId1 : null; - const schemaId2 = req.body ? req.body.schemaId2 : null; - const idLvl = req.body ? req.body.idLvl : null; - const user = req.user; - try { - const result = await guardians.compareSchemas(user, null, schemaId1, schemaId2, idLvl); - return res.send(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + /** + * Compare schemas + */ + @Post('/compare/schemas') + @HttpCode(HttpStatus.OK) + async compareSchemas(@Body() body, @Req() req): Promise { + const guardians = new Guardians(); + const schemaId1 = body ? body.schemaId1 : null; + const schemaId2 = body ? body.schemaId2 : null; + const idLvl = body ? body.idLvl : null; + const user = req.user; + try { + return await guardians.compareSchemas(user, null, schemaId1, schemaId2, idLvl); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -analyticsAPI.post('/compare/policies/export', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardians = new Guardians(); - const type = req.query ? req.query.type : null; - const policyId1 = req.body ? req.body.policyId1 : null; - const policyId2 = req.body ? req.body.policyId2 : null; - const eventsLvl = req.body ? req.body.eventsLvl : null; - const propLvl = req.body ? req.body.propLvl : null; - const childrenLvl = req.body ? req.body.childrenLvl : null; - const idLvl = req.body ? req.body.idLvl : null; - const user = req.user; - try { - const result = await guardians.comparePolicies( - user, - type, - policyId1, - policyId2, - eventsLvl, - propLvl, - childrenLvl, - idLvl - ); - return res.send(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + /** + * Compare policies export + * @param body + * @param req + */ + @Post('/compare/policies/export') + @HttpCode(HttpStatus.OK) + async comparePoliciesExport(@Body() body, @Req() req): Promise { + const guardians = new Guardians(); + const type = req.query ? req.query.type : null; + const policyId1 = body ? body.policyId1 : null; + const policyId2 = body ? body.policyId2 : null; + const eventsLvl = body ? body.eventsLvl : null; + const propLvl = body ? body.propLvl : null; + const childrenLvl = body ? body.childrenLvl : null; + const idLvl = body ? body.idLvl : null; + const user = req.user; + try { + const result = await guardians.comparePolicies( + user, + type, + policyId1, + policyId2, + eventsLvl, + propLvl, + childrenLvl, + idLvl + ); + return result + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -analyticsAPI.post('/compare/schemas/export', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardians = new Guardians(); - const type = req.query ? req.query.type : null; - const schemaId1 = req.body ? req.body.schemaId1 : null; - const schemaId2 = req.body ? req.body.schemaId2 : null; - const idLvl = req.body ? req.body.idLvl : null; - const user = req.user; - try { - const result = await guardians.compareSchemas(user, type, schemaId1, schemaId2, idLvl); - return res.send(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + /** + * compareSchemasExport + * @param body + * @param req + */ + @Post('/compare/schemas/export') + @HttpCode(HttpStatus.OK) + async compareSchemasExport(@Body() body, @Req() req): Promise { + const guardians = new Guardians(); + const type = req.query ? req.query.type : null; + const schemaId1 = body ? body.schemaId1 : null; + const schemaId2 = body ? body.schemaId2 : null; + const idLvl = body ? body.idLvl : null; + const user = req.user; + try { + return await guardians.compareSchemas(user, type, schemaId1, schemaId2, idLvl); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); +} diff --git a/api-gateway/src/api/service/artifact.ts b/api-gateway/src/api/service/artifact.ts index 8eccb041ae..5b19a8b2cf 100644 --- a/api-gateway/src/api/service/artifact.ts +++ b/api-gateway/src/api/service/artifact.ts @@ -1,78 +1,91 @@ -import { permissionHelper } from '@auth/authorization-helper'; -import { Response, Router, NextFunction } from 'express'; import { PolicyType, UserRole } from '@guardian/interfaces'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; import { PolicyEngine } from '@helpers/policy-engine'; -import createError from 'http-errors'; +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; -/** - * Artifact route - */ -export const artifactAPI = Router(); +@Controller('artifacts') +export class ArtifactApi { -artifactAPI.get('/', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const policyId = req.query.policyId as string; - const guardians = new Guardians(); - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; + /** + * Get artifacts + * @param req + * @param res + */ + @Get('/') + @HttpCode(HttpStatus.OK) + async getArtifacts(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const policyId = req.query.policyId as string; + const guardians = new Guardians(); + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const { artifacts, count } = await guardians.getArtifacts(req.user.did, policyId, pageIndex, pageSize); + return res.setHeader('X-Total-Count', count).json(artifacts); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const { artifacts, count } = await guardians.getArtifacts(req.user.did, policyId, pageIndex, pageSize); - return res.setHeader('X-Total-Count', count).json(artifacts); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -artifactAPI.post('/:policyId', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - const policyEngine = new PolicyEngine(); - const policy = await policyEngine.getPolicy({ - filters: { - id: req.params.policyId, - owner: req.user.did + /** + * upload + * @param req + * @param res + */ + @Post('/:policyId') + @HttpCode(HttpStatus.CREATED) + async uploadArtifacts(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + const policyEngine = new PolicyEngine(); + const policy = await policyEngine.getPolicy({ + filters: { + id: req.params.policyId, + owner: req.user.did + } + }); + if (!policy || policy.status !== PolicyType.DRAFT) { + throw new HttpException('There is no appropriate policy or policy is not in DRAFT status', HttpStatus.UNPROCESSABLE_ENTITY); } - }); - if (!policy || policy.status !== PolicyType.DRAFT) { - return next(createError(422, 'There is no appropriate policy or policy is not in DRAFT status')); - } - const files = req.files; - if (!files) { - return next(createError(422, 'There are no files to upload')); - } - const artifacts = Array.isArray(files.artifacts) ? files.artifacts : [files.artifacts]; - const uploadedArtifacts = []; - for (const artifact of artifacts) { - if (!artifact) { - continue; + const files = req.files; + if (!files) { + throw new HttpException('There are no files to upload', HttpStatus.UNPROCESSABLE_ENTITY) + // return next(createError(422, 'There are no files to upload')); } - uploadedArtifacts.push(await guardian.uploadArtifact(artifact, req.user.did, req.params.policyId)); + const artifacts = Array.isArray(files.artifacts) ? files.artifacts : [files.artifacts]; + const uploadedArtifacts = []; + for (const artifact of artifacts) { + if (!artifact) { + continue; + } + uploadedArtifacts.push(await guardian.uploadArtifact(artifact, req.user.did, req.params.policyId)); + } + return res.status(201).json(uploadedArtifacts); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - return res.status(201).json(uploadedArtifacts); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -artifactAPI.delete('/:artifactId', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - await guardian.deleteArtifact(req.params.artifactId, req.user.did) - return res.status(204).send(); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Delete('/:artifactId') + @HttpCode(HttpStatus.NO_CONTENT) + async deleteArtifact(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + await guardian.deleteArtifact(req.params.artifactId, req.user.did) + return res.status(204).send(); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); +} diff --git a/api-gateway/src/api/service/contract.ts b/api-gateway/src/api/service/contract.ts index c816309f20..8cabfb4deb 100644 --- a/api-gateway/src/api/service/contract.ts +++ b/api-gateway/src/api/service/contract.ts @@ -1,240 +1,245 @@ import { Guardians } from '@helpers/guardians'; -import { Response, Router, NextFunction } from 'express'; -import { UserRole} from '@guardian/interfaces'; -import { permissionHelper } from '@auth/authorization-helper'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; -import validate from '@middlewares/validation'; -import { importSchema, retireRequestSchema, retireSchema } from '@middlewares/validation/schemas/contracts'; +import { UserRole } from '@guardian/interfaces'; +import { Logger } from '@guardian/common'; +import { Controller, Delete, Get, HttpCode, HttpStatus, Post, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; /** - * Contract route + * Contracts api */ -export const contractAPI = Router(); +@Controller('contracts') +export class ContractsApi { -contractAPI.get('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const [contracts, count] = await guardians.getContracts( - user.parent || user.did, - req.query.pageIndex as any, - req.query.pageSize as any - ); - return res.setHeader('X-Total-Count', count).json(contracts); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) - } -}); + /** + * Get contracts + * @param req + * @param res + */ + @Get() + @HttpCode(HttpStatus.OK) + async getContracts(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const guardians = new Guardians(); + const [contracts, count] = await guardians.getContracts( + user.parent || user.did, + req.query.pageIndex as any, + req.query.pageSize as any + ); + return res.setHeader('X-Total-Count', count).json(contracts); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } -contractAPI.post( - '/', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const {description} = req.body; - const guardians = new Guardians(); - return res.json( - await guardians.createContract(user.did, description) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + /** + * Set contracts + * @param req + * @param res + */ + @Post('/') + @HttpCode(HttpStatus.OK) + async setContracts(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const {description} = req.body; + const guardians = new Guardians(); + return res.status(201).json( + await guardians.createContract(user.did, description) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.post( - '/import', - [validate(importSchema()), permissionHelper(UserRole.STANDARD_REGISTRY)], - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const {contractId, description} = req.body; - const guardians = new Guardians(); - return res.json( - await guardians.importContract( - user.did, - contractId, - description - ) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Post('/import') + @HttpCode(HttpStatus.OK) + async importContracts(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const {contractId, description} = req.body; + const guardians = new Guardians(); + return res.json( + await guardians.importContract( + user.did, + contractId, + description + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.post( - '/:contractId/user', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const {userId} = req.body; - const guardians = new Guardians(); - return res.json( - await guardians.addUser(user.did, userId, req.params.contractId) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Post('/:contractId/user') + @HttpCode(HttpStatus.OK) + async userContract(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const {userId} = req.body; + const guardians = new Guardians(); + return res.json( + await guardians.addUser(user.did, userId, req.params.contractId) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.post( - '/:contractId/status', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - return res.json( - await guardians.updateStatus(user.did, req.params.contractId) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Post(':contractId/status') + @HttpCode(HttpStatus.OK) + async contractStatus(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + return res.json( + await guardians.updateStatus(user.did, req.params.contractId) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.get('/pair', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - return res.json( - await guardians.getContractPair( - user.did, - user.parent || user.did, - req.query?.baseTokenId as string, - req.query?.oppositeTokenId as string - ) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); + @Get('/pair') + @HttpCode(HttpStatus.OK) + async contractPair(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const guardians = new Guardians(); + return res.json( + await guardians.getContractPair( + user.did, + user.parent || user.did, + req.query?.baseTokenId as string, + req.query?.oppositeTokenId as string + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } -contractAPI.post( - '/:contractId/pair', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const { - baseTokenId, - oppositeTokenId, - baseTokenCount, - oppositeTokenCount, - } = req.body; - const guardians = new Guardians(); - return res.json( - await guardians.addContractPair( - user.did, - req.params.contractId, - baseTokenId, - oppositeTokenId, - baseTokenCount, - oppositeTokenCount - ) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Post('/:contractId/pair') + @HttpCode(HttpStatus.OK) + async setPair(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const { + baseTokenId, + oppositeTokenId, + baseTokenCount, + oppositeTokenCount, + } = req.body; + const guardians = new Guardians(); + return res.json( + await guardians.addContractPair( + user.did, + req.params.contractId, + baseTokenId, + oppositeTokenId, + baseTokenCount, + oppositeTokenCount + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.get( - '/retire/request', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const [requests, count] = await guardians.getRetireRequests( - user.parent || user.did, - user.role === UserRole.USER ? user.did : null, - req.query?.contractId as string, - req.query?.pageIndex as any, - req.query?.pageSize as any - ); - return res.setHeader('X-Total-Count', count).json(requests); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Get('/retire/request') + @HttpCode(HttpStatus.OK) + async retireRequest(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const guardians = new Guardians(); + const [requests, count] = await guardians.getRetireRequests( + user.parent || user.did, + user.role === UserRole.USER ? user.did : null, + req.query?.contractId as string, + req.query?.pageIndex as any, + req.query?.pageSize as any + ); + return res.setHeader('X-Total-Count', count).json(requests); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.post( - '/:contractId/retire/request', validate(retireRequestSchema()), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const { - baseTokenId, - oppositeTokenId, - baseTokenCount, - oppositeTokenCount, - baseTokenSerials, - oppositeTokenSerials, - } = req.body; - const guardians = new Guardians(); - return res.json( - await guardians.retireRequest( - user.did, - req.params.contractId, - baseTokenId, - oppositeTokenId, - baseTokenCount, - oppositeTokenCount, - baseTokenSerials, - oppositeTokenSerials - ) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Post('/:contractId/retire/request') + @HttpCode(HttpStatus.OK) + async postRetireRequest(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const { + baseTokenId, + oppositeTokenId, + baseTokenCount, + oppositeTokenCount, + baseTokenSerials, + oppositeTokenSerials, + } = req.body; + const guardians = new Guardians(); + return res.json( + await guardians.retireRequest( + user.did, + req.params.contractId, + baseTokenId, + oppositeTokenId, + baseTokenCount, + oppositeTokenCount, + baseTokenSerials, + oppositeTokenSerials + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.delete( - '/retire/request', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - return res.json( - await guardians.cancelRetireRequest( - user.did, - req.query?.requestId as string - ) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Delete('/retire/request') + @HttpCode(HttpStatus.OK) + async deleteRetireRequest(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const guardians = new Guardians(); + return res.json( + await guardians.cancelRetireRequest( + user.did, + req.query?.requestId as string + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); -contractAPI.post( - '/retire', - [validate(retireSchema()), permissionHelper(UserRole.STANDARD_REGISTRY)], - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const { requestId } = req.body; - const guardians = new Guardians(); - return res.json(await guardians.retire(user.did, requestId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error) + @Post('/retire') + @HttpCode(HttpStatus.OK) + async retire(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const { requestId } = req.body; + const guardians = new Guardians(); + return res.json(await guardians.retire(user.did, requestId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - } -); +} diff --git a/api-gateway/src/api/service/demo.ts b/api-gateway/src/api/service/demo.ts index a56ed8e863..b5ac596711 100644 --- a/api-gateway/src/api/service/demo.ts +++ b/api-gateway/src/api/service/demo.ts @@ -1,164 +1,176 @@ -import { Request, Response, Router, NextFunction } from 'express'; import { Guardians } from '@helpers/guardians'; import { Users } from '@helpers/users'; import { Logger, RunFunctionAsync } from '@guardian/common'; import { TaskManager } from '@helpers/task-manager'; import { ServiceError } from '@helpers/service-requests-base'; - -/** - * Route for demo api - */ -export const demoAPI = Router(); - -/** - * @deprecated 2023-03-01 - */ -demoAPI.get('/registeredUsers', async (req: Request, res: Response) => { - const users = new Users(); - const guardians = new Guardians(); - try { - const demoUsers: any = await users.getAllUserAccountsDemo(); - - for (const element of demoUsers) { - if (element.did) { - element.policyRoles = await guardians.getUserRoles(element.did); - } else { - element.policyRoles = []; - } - } - - res.json(demoUsers); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).send({ code: 500, message: error.message }); - } -}); - -/** - * @deprecated 2023-03-01 - */ -demoAPI.get('/randomKey', async (req: Request, res: Response) => { - try { +import { Controller, Get, HttpCode, HttpStatus, Req, Response } from '@nestjs/common'; + +@Controller('demo') +export class DemoApi { + + /** + * @deprecated 2023-03-01 + */ + @Get('/registeredUsers') + @HttpCode(HttpStatus.OK) + async registeredUsers(@Req() req, @Response() res): Promise { + const users = new Users(); const guardians = new Guardians(); - let role = null; try { - const authHeader = req?.headers?.authorization; - if (authHeader) { - const users = new Users(); - const token = authHeader.split(' ')[1]; - const user = await users.getUserByToken(token) as any; - role = user?.role; + const demoUsers: any = await users.getAllUserAccountsDemo(); + + for (const element of demoUsers) { + if (element.did) { + element.policyRoles = await guardians.getUserRoles(element.did); + } else { + element.policyRoles = []; + } } + + return res.json(demoUsers); } catch (error) { - role = null; + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const demoKey = await guardians.generateDemoKey(role); - res.status(200).json(demoKey); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).json({ code: 500, message: error.message }); } -}); -/** - * @deprecated 2023-03-01 - */ -demoAPI.get('/push/randomKey', async (req: Request, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Create random key'); - - const authHeader = req?.headers?.authorization; - RunFunctionAsync(async () => { - const guardians = new Guardians(); - let role = null; - if (authHeader) { + /** + * @deprecated 2023-03-01 + */ + @Get('/randomKey') + @HttpCode(HttpStatus.OK) + async randomKey(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + let role = null; try { - const users = new Users(); - const token = authHeader.split(' ')[1]; - const user = await users.getUserByToken(token) as any; - role = user?.role; + const authHeader = req?.headers?.authorization; + if (authHeader) { + const users = new Users(); + const token = authHeader.split(' ')[1]; + const user = await users.getUserByToken(token) as any; + role = user?.role; + } } catch (error) { role = null; } + const demoKey = await guardians.generateDemoKey(role); + return demoKey; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } - await guardians.generateDemoKeyAsync(role, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); - - res.status(201).send({ taskId, expectation }); -}); - -demoAPI.get('/registered-users', async (req: Request, res: Response, next: NextFunction) => { - const users = new Users(); - const guardians = new Guardians(); - try { - const demoUsers: any = await users.getAllUserAccountsDemo(); - - for (const element of demoUsers) { - if (element.did) { - element.policyRoles = await guardians.getUserRoles(element.did); - } else { - element.policyRoles = []; + /** + * @deprecated 2023-03-01 + */ + @Get('/push/randomKey') + @HttpCode(HttpStatus.CREATED) + async pushRandomKey(@Req() req, @Response() res): Promise { + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create random key'); + + const authHeader = req?.headers?.authorization; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + let role = null; + if (authHeader) { + try { + const users = new Users(); + const token = authHeader.split(' ')[1]; + const user = await users.getUserByToken(token) as any; + role = user?.role; + } catch (error) { + role = null; + } } - } - res.json(demoUsers); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + await guardians.generateDemoKeyAsync(role, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + + return res.status(201).send({ taskId, expectation }); } -}); -demoAPI.get('/random-key', async (req: Request, res: Response, next: NextFunction) => { - try { + @Get('/registered-users') + @HttpCode(HttpStatus.OK) + async registeredUsers2(@Req() req, @Response() res): Promise { + const users = new Users(); const guardians = new Guardians(); - let role = null; try { - const authHeader = req?.headers?.authorization; - if (authHeader) { - const users = new Users(); - const token = authHeader.split(' ')[1]; - const user = await users.getUserByToken(token) as any; - role = user?.role; + const demoUsers: any = await users.getAllUserAccountsDemo(); + + for (const element of demoUsers) { + if (element.did) { + element.policyRoles = await guardians.getUserRoles(element.did); + } else { + element.policyRoles = []; + } } + + return res.json(demoUsers); } catch (error) { - role = null; + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const demoKey = await guardians.generateDemoKey(role); - return res.json(demoKey); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); - -demoAPI.get('/push/random-key', async (req: Request, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Create random key'); - const authHeader = req?.headers?.authorization; - RunFunctionAsync(async () => { - const guardians = new Guardians(); - let role = null; - if (authHeader) { + @Get('/random-key') + @HttpCode(HttpStatus.OK) + async randomKey2(@Req() req): Promise { + try { + const guardians = new Guardians(); + let role = null; try { - const users = new Users(); - const token = authHeader.split(' ')[1]; - const user = await users.getUserByToken(token) as any; - role = user?.role; + const authHeader = req?.headers?.authorization; + if (authHeader) { + const users = new Users(); + const token = authHeader.split(' ')[1]; + const user = await users.getUserByToken(token) as any; + role = user?.role; + } } catch (error) { role = null; } + const demoKey = await guardians.generateDemoKey(role); + return demoKey; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } + + @Get('/push/random-key') + @HttpCode(HttpStatus.ACCEPTED) + async pushRandomKey2(@Req() req, @Response() res): Promise { + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create random key'); - await guardians.generateDemoKeyAsync(role, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); + const authHeader = req?.headers?.authorization; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + let role = null; + if (authHeader) { + try { + const users = new Users(); + const token = authHeader.split(' ')[1]; + const user = await users.getUserByToken(token) as any; + role = user?.role; + } catch (error) { + role = null; + } + } + + await guardians.generateDemoKeyAsync(role, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); + } - return res.status(202).send({ taskId, expectation }); -}); +} diff --git a/api-gateway/src/api/service/external.ts b/api-gateway/src/api/service/external.ts index a88cd3d3d7..0b2535001f 100644 --- a/api-gateway/src/api/service/external.ts +++ b/api-gateway/src/api/service/external.ts @@ -1,19 +1,19 @@ -import { Request, Response, Router, NextFunction } from 'express'; import { PolicyEngine } from '@helpers/policy-engine'; import { Logger } from '@guardian/common'; +import { Controller, HttpCode, HttpStatus, Post, Req, Response } from '@nestjs/common'; -/** - * Route for demo api - */ -export const externalAPI = Router(); +@Controller('external') +export class ExternalApi { + @Post('/') + @HttpCode(HttpStatus.OK) + async receiveExternalData(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); -externalAPI.post('/', async (req: Request, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - - try { - res.send(await engineService.receiveExternalData(req.body)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + try { + return res.send(await engineService.receiveExternalData(req.body)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); +} diff --git a/api-gateway/src/api/service/index.ts b/api-gateway/src/api/service/index.ts index 90370e15a8..d187bbde98 100644 --- a/api-gateway/src/api/service/index.ts +++ b/api-gateway/src/api/service/index.ts @@ -1,15 +1,16 @@ -export { trustchainsAPI } from '@api/service/trustchains'; -export { trustChainsAPI } from '@api/service/trust-chains'; -export { profileAPI } from '@api/service/profile'; -export { schemaAPI } from '@api/service/schema'; -export { tokenAPI } from '@api/service/tokens'; -export { accountAPI } from '@api/service/account'; -export { demoAPI } from '@api/service/demo'; -export { externalAPI } from '@api/service/external'; -export { ipfsAPI } from '@api/service/ipfs' -export { loggerAPI } from '@api/service/logger'; -export { settingsAPI } from '@api/service/settings'; -export { analyticsAPI } from '@api/service/analytics'; -export { moduleAPI } from '@api/service/module'; -export { tagsAPI } from '@api/service/tags'; -export { themesAPI } from '@api/service/themes'; \ No newline at end of file +// export { trustchainsAPI } from '@api/service/trustchains'; +// export { trustChainsAPI } from '@api/service/trust-chains'; +// export { profileAPI } from '@api/service/profile'; +// export { schemaAPI } from '@api/service/schema'; +// export { tokenAPI } from '@api/service/tokens'; +// export { accountAPI } from '@api/service/account'; +// export { demoAPI } from '@api/service/demo'; +// export { externalAPI } from '@api/service/external'; +// export { ipfsAPI } from '@api/service/ipfs' +// export { loggerAPI } from '@api/service/logger'; +// export { settingsAPI } from '@api/service/settings'; +// export { analyticsAPI } from '@api/service/analytics'; +// export { moduleAPI } from '@api/service/module'; +// export { tagsAPI } from '@api/service/tags'; +// export { themesAPI } from '@api/service/themes'; +// export { metricsAPI } from '@api/service/metrics'; diff --git a/api-gateway/src/api/service/ipfs.ts b/api-gateway/src/api/service/ipfs.ts index c8f5d03620..1155590078 100644 --- a/api-gateway/src/api/service/ipfs.ts +++ b/api-gateway/src/api/service/ipfs.ts @@ -1,48 +1,49 @@ -import { Response, Router, NextFunction} from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; -import createError from 'http-errors'; -import { prepareValidationResponse } from '@middlewares/validation'; +import { Controller, Get, HttpCode, HttpException, HttpStatus, Post, Req, Response } from '@nestjs/common'; -/** - * IPFS route - */ -export const ipfsAPI = Router(); +@Controller('ipfs') +export class IpfsApi { + @Post('/file') + @HttpCode(HttpStatus.CREATED) + async postFile(@Req() req, @Response() res): Promise { + try { + if (!Object.values(req.body).length) { + throw new HttpException('Body content in request is empty', HttpStatus.UNPROCESSABLE_ENTITY) + } -ipfsAPI.post('/file', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - if (!Object.values(req.body).length) { - return res.status(422).json(prepareValidationResponse('Body content in request is empty')); - } + const guardians = new Guardians(); + const { cid } = await guardians.addFileIpfs(req.body); + if (!cid) { + throw new HttpException('File is not uploaded', HttpStatus.BAD_REQUEST) + // return next(createError(400, 'File is not uploaded')); + } - const guardians = new Guardians(); - const { cid } = await guardians.addFileIpfs(req.body); - if (!cid) { - return next(createError(400, 'File is not uploaded')); + return res.status(201).json(cid); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - - return res.status(201).json(cid); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -ipfsAPI.get('/file/:cid', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const result = await guardians.getFileIpfs(req.params.cid, 'raw'); - const resultBuffer = Buffer.from(result); - if (!result) { - return next(createError(404, 'File is not uploaded')); + @Get('/file/:cid') + @HttpCode(HttpStatus.OK) + async getFile(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const result = await guardians.getFileIpfs(req.params.cid, 'raw'); + const resultBuffer = Buffer.from(result); + if (!result) { + throw new HttpException('File is not uploaded', HttpStatus.NOT_FOUND) + } + res.writeHead(200, { + 'Content-Type': 'binary/octet-stream', + 'Content-Length': resultBuffer.length, + }); + return res.end(resultBuffer, 'binary'); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - res.writeHead(200, { - 'Content-Type': 'binary/octet-stream', - 'Content-Length': resultBuffer.length, - }); - return res.end(resultBuffer, 'binary'); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); +} diff --git a/api-gateway/src/api/service/logger.ts b/api-gateway/src/api/service/logger.ts index 17d98bcf8b..c5d9f0074a 100644 --- a/api-gateway/src/api/service/logger.ts +++ b/api-gateway/src/api/service/logger.ts @@ -1,12 +1,96 @@ -import { permissionHelper } from '@auth/authorization-helper'; -import { Request, Response, Router, NextFunction } from 'express'; -import { IPageParameters, UserRole } from '@guardian/interfaces'; +import { IPageParameters, MessageAPI, UserRole } from '@guardian/interfaces'; import { Logger } from '@guardian/common'; +import { Controller, Get, HttpCode, HttpStatus, Inject, Injectable, Post, Req, Response } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { checkPermission } from '@auth/authorization-helper'; + +@Injectable() +export class LoggerService { + constructor(@Inject('GUARDIANS') private readonly client: ClientProxy) { + } + + async getLogs(filters?: any, pageParameters?: IPageParameters, sortDirection?: string): Promise { + const logs = await this.client.send(MessageAPI.GET_LOGS, { + filters, pageParameters, sortDirection + }).toPromise(); + return logs.body; + } + + async getAttributes(name?: string, existingAttributes: string[] = []): Promise { + const logs = await this.client.send(MessageAPI.GET_ATTRIBUTES, { + name, existingAttributes + }).toPromise(); + return logs.body; + } +} + +@Controller('logs') +export class LoggerApi { + constructor(private readonly loggerService: LoggerService) { + } + + @Post('/') + @HttpCode(HttpStatus.OK) + async getLogs(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const filters: any = {}; + const pageParameters: IPageParameters = {}; + if (req.body.type) { + filters.type = req.body.type; + } + if (req.body.startDate && req.body.endDate) { + const sDate = new Date(req.body.startDate); + sDate.setHours(0, 0, 0, 0); + const eDate = new Date(req.body.endDate); + eDate.setHours(23, 59, 59, 999); + filters.datetime = { + $gte: sDate, + $lt: eDate + }; + } + if (req.body.attributes && req.body.attributes.length !== 0) { + filters.attributes = { $in: req.body.attributes }; + } + if (req.body.message) { + filters.message = { + $regex: `.*${escapeRegExp(req.body.message)}.*`, + $options: 'i' + } + } + if (req.body.pageSize) { + pageParameters.offset = (req.body.pageIndex || 0) * req.body.pageSize; + pageParameters.limit = req.body.pageSize; + } + const logsObj = await this.loggerService.getLogs(filters, pageParameters, req.body.sortDirection); + return res.send(logsObj); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('attributes') + @HttpCode(HttpStatus.OK) + async getAttributes(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + if (req.query.existingAttributes && !Array.isArray(req.query.existingAttributes)) { + req.query.existingAttributes = [req.query.existingAttributes as string]; + } + const attributes = await this.loggerService.getAttributes(escapeRegExp(req.query.name as string), req.query.existingAttributes as string[]); + return res.send(attributes); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } +} /** * Logger route */ -export const loggerAPI = Router(); +// export const loggerAPI = Router(); /** * Add escape characters @@ -20,57 +104,3 @@ function escapeRegExp(text: string): string { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); } - -loggerAPI.post('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: Request, res: Response, next: NextFunction) => { - try { - const filters: any = {}; - const pageParameters: IPageParameters = {}; - if (req.body.type) { - filters.type = req.body.type; - } - if (req.body.startDate && req.body.endDate) { - const sDate = new Date(req.body.startDate); - sDate.setHours(0, 0, 0, 0); - const eDate = new Date(req.body.endDate); - eDate.setHours(23, 59, 59, 999); - filters.datetime = { - $gte: sDate, - $lt: eDate - }; - } - if (req.body.attributes && req.body.attributes.length !== 0) { - filters.attributes = { $in: req.body.attributes }; - } - if (req.body.message) { - filters.message = { - $regex: `.*${escapeRegExp(req.body.message)}.*`, - $options: 'i' - } - } - if (req.body.pageSize) { - pageParameters.offset = (req.body.pageIndex || 0) * req.body.pageSize; - pageParameters.limit = req.body.pageSize; - } - const logger = new Logger(); - const logsObj = await logger.getLogs(filters, pageParameters, req.body.sortDirection); - return res.send(logsObj); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -loggerAPI.get('/attributes', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: Request, res: Response, next: NextFunction) => { - try { - const logger = new Logger(); - if (req.query.existingAttributes && !Array.isArray(req.query.existingAttributes)) { - req.query.existingAttributes = [req.query.existingAttributes as string]; - } - const attributes = await logger.getAttributes(escapeRegExp(req.query.name as string), req.query.existingAttributes as string[]); - return res.send(attributes); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); diff --git a/api-gateway/src/api/service/map.ts b/api-gateway/src/api/service/map.ts index 6c009b1621..b9e872968f 100644 --- a/api-gateway/src/api/service/map.ts +++ b/api-gateway/src/api/service/map.ts @@ -1,21 +1,12 @@ -import { Response, Router, NextFunction } from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; +import { Controller, Get, HttpCode, HttpStatus } from '@nestjs/common'; -/** - * Map route - */ -export const mapAPI = Router(); - -mapAPI.get( - '/key', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - res.send(await guardians.getMapApiKey()); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } +@Controller('map') +export class MapApi { + @Get('/key') + @HttpCode(HttpStatus.OK) + async getKey() { + const guardians = new Guardians(); + return await guardians.getMapApiKey(); } -); +} diff --git a/api-gateway/src/api/service/metrics.ts b/api-gateway/src/api/service/metrics.ts new file mode 100644 index 0000000000..4ea7fb328c --- /dev/null +++ b/api-gateway/src/api/service/metrics.ts @@ -0,0 +1,12 @@ +import client from 'prom-client'; +import { Controller, Get, HttpCode, HttpStatus, Response } from '@nestjs/common'; + +@Controller('metrics') +export class MetricsApi { + @Get('/') + @HttpCode(HttpStatus.OK) + async getMetrics(@Response() res) { + res.set('Content-Type', client.register.contentType); + return res.send(await client.register.metrics()); + } +} diff --git a/api-gateway/src/api/service/module.ts b/api-gateway/src/api/service/module.ts index 19013c951b..50c1e9657f 100644 --- a/api-gateway/src/api/service/module.ts +++ b/api-gateway/src/api/service/module.ts @@ -1,193 +1,232 @@ -import { permissionHelper } from '@auth/authorization-helper'; -import { Response, Router, NextFunction } from 'express'; -import { UserRole } from '@guardian/interfaces'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; -import createError from 'http-errors'; +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; +import { UserRole } from '@guardian/interfaces'; -/** - * Module route - */ -export const moduleAPI = Router(); +@Controller('modules') +export class ModulesApi { + @Post('/') + @HttpCode(HttpStatus.CREATED) + async postModules(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + const module = req.body; + if (!module.config || module.config.blockType !== 'module') { + throw new HttpException('Invalid module config', HttpStatus.UNPROCESSABLE_ENTITY); + } + const item = await guardian.createModule(module, req.user.did); + return res.status(201).json(item); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); + } + } -moduleAPI.post('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - const module = req.body; - if (!module.config || module.config.blockType !== 'module') { - return next(createError(422, 'Invalid module config')); + @Get('/') + @HttpCode(HttpStatus.OK) + async getModules(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const { items, count } = await guardians.getModule({ + owner: req.user.did, + pageIndex, + pageSize + }); + return res.setHeader('X-Total-Count', count).json(items); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); } - const item = await guardian.createModule(module, req.user.did); - res.status(201).json(item); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -moduleAPI.get('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Delete('/:uuid') + @HttpCode(HttpStatus.OK) + async deleteModule(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + if (!req.params.uuid) { + throw new Error('Invalid uuid') + } + const result = await guardian.deleteModule(req.params.uuid, req.user.did); + return res.status(200).json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); + } + } - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; + @Get('/menu') + @HttpCode(HttpStatus.OK) + async getMenu(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const items = await guardians.getMenuModule(req.user.did); + return res.json(items); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); } - const { items, count } = await guardians.getModule({ - owner: req.user.did, - pageIndex, - pageSize - }); - res.setHeader('X-Total-Count', count).json(items); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -moduleAPI.delete('/:uuid', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - if (!req.params.uuid) { - return next(createError(422, 'Invalid uuid')); + @Get('/:uuid') + @HttpCode(HttpStatus.OK) + async getModule(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + if (!req.params.uuid) { + throw new HttpException('Invalid uuid', HttpStatus.UNPROCESSABLE_ENTITY) + } + const item = await guardian.getModuleById(req.params.uuid, req.user.did); + return res.json(item); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const result = await guardian.deleteModule(req.params.uuid, req.user.did); - res.status(201).json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); - -moduleAPI.get('/menu', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const items = await guardians.getMenuModule(req.user.did); - res.json(items); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Put('/:uuid') + @HttpCode(HttpStatus.CREATED) + async putModule(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardian = new Guardians(); + if (!req.params.uuid) { + throw new HttpException('Invalid uuid', HttpStatus.UNPROCESSABLE_ENTITY); + } + const module = req.body; + if (!module.config || module.config.blockType !== 'module') { + throw new HttpException('Invalid module config', HttpStatus.UNPROCESSABLE_ENTITY) + } + const result = await guardian.updateModule(req.params.uuid, module, req.user.did); + return res.status(201).json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -moduleAPI.get('/:uuid', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { + @Get('/:uuid/export/file') + @HttpCode(HttpStatus.OK) + async moduleExportFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); const guardian = new Guardians(); - if (!req.params.uuid) { - return next(createError(422, 'Invalid uuid')); + try { + const file: any = await guardian.exportModuleFile(req.params.uuid, req.user.did); + res.setHeader('Content-disposition', `attachment; filename=module_${Date.now()}`); + res.setHeader('Content-type', 'application/zip'); + return res.send(file); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - const item = await guardian.getModuleById(req.params.uuid, req.user.did); - res.json(item); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -moduleAPI.put('/:uuid', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { + @Get('/:uuid/export/message') + @HttpCode(HttpStatus.OK) + async moduleExportMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); const guardian = new Guardians(); - if (!req.params.uuid) { - return next(createError(422, 'Invalid uuid')); + try { + return res.send(await guardian.exportModuleMessage(req.params.uuid, req.user.did)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const module = req.body; - if (!module.config || module.config.blockType !== 'module') { - return next(createError(422, 'Invalid module config')); - } - const result = await guardian.updateModule(req.params.uuid, module, req.user.did); - res.status(201).json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -moduleAPI.get('/:uuid/export/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const file: any = await guardian.exportModuleFile(req.params.uuid, req.user.did); - res.setHeader('Content-disposition', `attachment; filename=module_${Date.now()}`); - res.setHeader('Content-type', 'application/zip'); - res.send(file); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); - -moduleAPI.get('/:uuid/export/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - res.send(await guardian.exportModuleMessage(req.params.uuid, req.user.did)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -moduleAPI.post('/import/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const module = await guardian.importModuleMessage(req.body.messageId, req.user.did); - res.status(201).send(module); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Post('/import/message') + @HttpCode(HttpStatus.CREATED) + async moduleImportMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const guardian = new Guardians(); + try { + const module = await guardian.importModuleMessage(req.body.messageId, req.user.did); + return res.status(201).send(module); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); - -moduleAPI.post('/import/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const module = await guardian.importModuleFile(req.body, req.user.did); - res.status(201).send(module); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Post('/import/file') + @HttpCode(HttpStatus.CREATED) + async moduleImportFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const guardian = new Guardians(); + try { + const module = await guardian.importModuleFile(req.body, req.user.did); + return res.status(201).send(module); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); - -moduleAPI.post('/import/message/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const module = await guardian.previewModuleMessage(req.body.messageId, req.user.did); - res.send(module); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Post('/import/message/preview') + @HttpCode(HttpStatus.OK) + async moduleImportMessagePreview(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const guardian = new Guardians(); + try { + const module = await guardian.previewModuleMessage(req.body.messageId, req.user.did); + return res.send(module); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); - -moduleAPI.post('/import/file/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const module = await guardian.previewModuleFile(req.body, req.user.did); - res.send(module); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Post('/import/file/preview') + @HttpCode(HttpStatus.OK) + async moduleImportFilePreview(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const guardian = new Guardians(); + try { + const module = await guardian.previewModuleFile(req.body, req.user.did); + return res.send(module); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); - -moduleAPI.put('/:uuid/publish', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const module = await guardian.publishModule(req.params.uuid, req.user.did, req.body); - res.json(module); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Put('/:uuid/publish') + @HttpCode(HttpStatus.OK) + async publishModule(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const guardian = new Guardians(); + try { + const module = await guardian.publishModule(req.params.uuid, req.user.did, req.body); + return res.json(module); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); - -moduleAPI.post('/validate', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - res.send(await guardian.validateModule(req.user.did, req.body)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + + @Post('/validate') + @HttpCode(HttpStatus.OK) + async validateModule(@Req() req, @Response() res): Promise { + const guardian = new Guardians(); + try { + return res.send(await guardian.validateModule(req.user.did, req.body)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); + +} diff --git a/api-gateway/src/api/service/policy.ts b/api-gateway/src/api/service/policy.ts index c80020a526..f638a7235e 100644 --- a/api-gateway/src/api/service/policy.ts +++ b/api-gateway/src/api/service/policy.ts @@ -1,626 +1,715 @@ -import { Response, Router, NextFunction } from 'express'; import { PolicyType, UserRole } from '@guardian/interfaces'; import { PolicyEngine } from '@helpers/policy-engine'; import { Users } from '@helpers/users'; import { AuthenticatedRequest, Logger, RunFunctionAsync } from '@guardian/common'; -import { permissionHelper } from '@auth/authorization-helper'; import { TaskManager } from '@helpers/task-manager'; import { ServiceError } from '@helpers/service-requests-base'; -import createError from 'http-errors'; - -export const policyAPI = Router(); - -policyAPI.get('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const users = new Users(); - const engineService = new PolicyEngine(); - try { - const user = await users.getUser(req.user.username); - if (!user.did && user.role !== UserRole.AUDITOR) { - return res.setHeader('X-Total-Count', 0).json([]); - } - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - let result: any; - if (user.role === UserRole.STANDARD_REGISTRY) { - result = await engineService.getPolicies({ - filters: { - owner: user.did, - }, - userDid: user.did, - pageIndex, - pageSize - }); - } else if (user.role === UserRole.AUDITOR) { - const filters: any = { - status: PolicyType.PUBLISH, +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, RawBodyRequest, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; + +@Controller('policies') +export class PolicyApi { + @Get('/') + @HttpCode(HttpStatus.OK) + async getPolicies(@Req() req, @Response() res): Promise { + const users = new Users(); + const engineService = new PolicyEngine(); + try { + const user = await users.getUser(req.user.username); + if (!user.did && user.role !== UserRole.AUDITOR) { + return res.setHeader('X-Total-Count', 0).json([]); } - result = await engineService.getPolicies({ - filters, - userDid: user.did, - pageIndex, - pageSize - }); - } else { - const filters: any = { - status: PolicyType.PUBLISH, + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; } - if (user.parent) { - filters.owner = user.parent; + let result: any; + if (user.role === UserRole.STANDARD_REGISTRY) { + result = await engineService.getPolicies({ + filters: { + owner: user.did, + }, + userDid: user.did, + pageIndex, + pageSize + }); + } else if (user.role === UserRole.AUDITOR) { + const filters: any = { + status: PolicyType.PUBLISH, + } + result = await engineService.getPolicies({ + filters, + userDid: user.did, + pageIndex, + pageSize + }); + } else { + const filters: any = { + status: PolicyType.PUBLISH, + } + if (user.parent) { + filters.owner = user.parent; + } + result = await engineService.getPolicies({ + filters, + userDid: user.did, + pageIndex, + pageSize + }); } - result = await engineService.getPolicies({ - filters, + const { policies, count } = result; + return res.setHeader('X-Total-Count', count).json(policies); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Post('/') + @HttpCode(HttpStatus.CREATED) + async createPolicy(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policies = await engineService.createPolicy(req.body, req.user) + return res.status(201).json(policies); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/push') + @HttpCode(HttpStatus.ACCEPTED) + async createPolicyAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create policy'); + const model = req.body; + const user = req.user; + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.createPolicyAsync(model, user, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + return res.status(202).send({ taskId, expectation }); + } + + @Post('/push/:policyId') + @HttpCode(HttpStatus.ACCEPTED) + async updatePolicyAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Clone policy'); + const policyId = req.params.policyId; + const model = req.body; + const user = req.user; + + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.clonePolicyAsync(policyId, model, user, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + return res.status(202).send({ taskId, expectation }); + } + + @Delete('/push/:policyId') + @HttpCode(HttpStatus.ACCEPTED) + async deletePOlicyAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Delete policy'); + const policyId = req.params.policyId; + const user = req.user; + + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.deletePolicyAsync(policyId, user, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + return res.status(202).send({ taskId, expectation }); + } + + @Get('/:policyId') + @HttpCode(HttpStatus.OK) + async getPolicy(@Req() req, @Response() res): Promise { + const users = new Users(); + const engineService = new PolicyEngine(); + try { + const user = await users.getUser(req.user.username); + const model = (await engineService.getPolicy({ + filters: req.params.policyId, userDid: user.did, - pageIndex, - pageSize - }); - } - const { policies, count } = result; - return res.setHeader('X-Total-Count', count).json(policies); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policies = await engineService.createPolicy(req.body, req.user) - return res.status(201).json(policies); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/push', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Create policy'); - const model = req.body; - const user = req.user; - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.createPolicyAsync(model, user, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.post('/push/:policyId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Clone policy'); - const policyId = req.params.policyId; - const model = req.body; - const user = req.user; - - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.clonePolicyAsync(policyId, model, user, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.delete('/push/:policyId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Delete policy'); - const policyId = req.params.policyId; - const user = req.user; - - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.deletePolicyAsync(policyId, user, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.get('/:policyId', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const users = new Users(); - const engineService = new PolicyEngine(); - try { - const user = await users.getUser(req.user.username); - const model = (await engineService.getPolicy({ - filters: req.params.policyId, - userDid: user.did, - })) as any; - return res.send(model); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.put('/:policyId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const model = await engineService.getPolicy({ filters: req.params.policyId }) as any; - const policy = req.body; - - model.config = policy.config; - model.name = policy.name; - model.version = policy.version; - model.description = policy.description; - model.topicDescription = policy.topicDescription; - model.policyRoles = policy.policyRoles; - model.policyTopics = policy.policyTopics; - model.policyTokens = policy.policyTokens; - model.policyGroups = policy.policyGroups; - const result = await engineService.savePolicy(model, req.user, req.params.policyId); - res.json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); -// -policyAPI.put('/:policyId/publish', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.json(await engineService.publishPolicy(req.body, req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.put('/push/:policyId/publish', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Publish policy'); - - const model = req.body; - const user = req.user; - const policyId = req.params.policyId; - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.publishPolicyAsync(model, user, policyId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message || error }); - }); - - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.put('/:policyId/dry-run', - permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.json(await engineService.dryRunPolicy(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.put('/:policyId/draft', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.json(await engineService.draft(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/validate', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.validatePolicy(req.body, req.user)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); -// - -policyAPI.get('/:policyId/groups', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.getGroups(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/groups', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.selectGroup(req.user, req.params.policyId, req.body.uuid)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/blocks', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.getPolicyBlocks(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/blocks/:uuid', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.getBlockData(req.user, req.params.policyId, req.params.uuid)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/blocks/:uuid', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send( - await engineService.setBlockData(req.user, req.params.policyId, req.params.uuid, req.body) - ); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/tag/:tagName/blocks', - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - return res.send(await engineService.setBlockDataByTag(req.user, req.params.policyId, req.params.tagName, req.body)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/tag/:tagName', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.getBlockByTagName(req.user, req.params.policyId, req.params.tagName)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/tag/:tagName/blocks', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.getBlockDataByTag(req.user, req.params.policyId, req.params.tagName)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/blocks/:uuid/parents', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.getBlockParents(req.user, req.params.policyId, req.params.uuid)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/export/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policyFile: any = await engineService.exportFile(req.user, req.params.policyId); - const policy: any = await engineService.getPolicy({ filters: req.params.policyId }); - res.setHeader('Content-disposition', `attachment; filename=${policy.name}`); - res.setHeader('Content-type', 'application/zip'); - res.send(policyFile); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/export/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.exportMessage(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/import/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; - try { - const policies = await engineService.importMessage(req.user, req.body.messageId, versionOfTopicId); - res.status(201).send(policies); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/push/import/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Import policy message'); - - const user = req.user; - const messageId = req.body.messageId; - const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.importMessageAsync(user, messageId, versionOfTopicId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); - }); - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.post('/import/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; - try { - const policies = await engineService.importFile(req.user, req.body, versionOfTopicId); - res.status(201).send(policies); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/push/import/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Import policy file'); - - const user = req.user; - const zip = req.body; - const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.importFileAsync(user, zip, versionOfTopicId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); - }); - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.post('/import/message/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.importMessagePreview(req.user, req.body.messageId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/push/import/message/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Preview policy message'); - - const user = req.user; - const messageId = req.body.messageId; - RunFunctionAsync(async () => { - const engineService = new PolicyEngine(); - await engineService.importMessagePreviewAsync(user, messageId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); - }); - - res.status(202).send({ taskId, expectation }); -}); - -policyAPI.post('/import/file/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.importFilePreview(req.user, req.body)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/blocks/about', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.blockAbout()); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/dry-run/users', - permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); - } - - return res.send(await engineService.getVirtualUsers(req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/dry-run/user', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); - } - - res.send(await engineService.createVirtualUser(req.params.policyId, req.user.did)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/dry-run/login', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); - } - - res.send(await engineService.loginVirtualUser(req.params.policyId, req.body.did)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/dry-run/restart', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); - } - - res.json(await engineService.restartDryRun(req.body, req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.get('/:policyId/dry-run/transactions', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); - } - - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'transactions', pageIndex, pageSize) - return res.setHeader('X-Total-Count', count).json(data); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + })) as any; + return res.send(model); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Put('/:policyId') + @HttpCode(HttpStatus.OK) + async updatePolicy(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + const model = await engineService.getPolicy({ filters: req.params.policyId }) as any; + const policy = req.body; + + model.config = policy.config; + model.name = policy.name; + model.version = policy.version; + model.description = policy.description; + model.topicDescription = policy.topicDescription; + model.policyRoles = policy.policyRoles; + model.policyTopics = policy.policyTopics; + model.policyTokens = policy.policyTokens; + model.policyGroups = policy.policyGroups; + const result = await engineService.savePolicy(model, req.user, req.params.policyId); + return res.json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Put('/:policyId/publish') + @HttpCode(HttpStatus.OK) + async publishPolicy(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.json(await engineService.publishPolicy(req.body, req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Put('/push/:policyId/publish') + @HttpCode(HttpStatus.ACCEPTED) + async publishPolicyAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Publish policy'); + + const model = req.body; + const user = req.user; + const policyId = req.params.policyId; + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.publishPolicyAsync(model, user, policyId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message || error }); + }); + + return res.status(202).send({ taskId, expectation }); + } + + @Put('/:policyId/dry-run') + @HttpCode(HttpStatus.OK) + async dryRunPolicy(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.json(await engineService.dryRunPolicy(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Put('/:policyId/draft') + @HttpCode(HttpStatus.OK) + async draftPolicy(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.json(await engineService.draft(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/validate') + @HttpCode(HttpStatus.OK) + async validatePolicy(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.validatePolicy(req.body, req.user)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Get('/:policyId/groups') + @HttpCode(HttpStatus.OK) + async getPolicyGroups(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getGroups(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/groups') + @HttpCode(HttpStatus.OK) + async setPolicyGroups(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.selectGroup(req.user, req.params.policyId, req.body.uuid)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/blocks') + @HttpCode(HttpStatus.OK) + async getPolicyBlocks(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getPolicyBlocks(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Get('/:policyId/blocks/:uuid') + @HttpCode(HttpStatus.OK) + async getBlockData(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getBlockData(req.user, req.params.policyId, req.params.uuid)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/blocks/:uuid') + @HttpCode(HttpStatus.OK) + async setBlockData(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send( + await engineService.setBlockData(req.user, req.params.policyId, req.params.uuid, req.body) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/tag/:tagName/blocks') + @HttpCode(HttpStatus.OK) + async setBlocksByTagName(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.setBlockDataByTag(req.user, req.params.policyId, req.params.tagName, req.body)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/tag/:tagName') + @HttpCode(HttpStatus.OK) + async getBlockByTagName(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getBlockByTagName(req.user, req.params.policyId, req.params.tagName)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/tag/:tagName/blocks') + @HttpCode(HttpStatus.OK) + async getBlocksByTagName(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getBlockDataByTag(req.user, req.params.policyId, req.params.tagName)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/blocks/:uuid/parents') + @HttpCode(HttpStatus.OK) + async getBlockParents(@Req() req, @Response() res): Promise { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getBlockParents(req.user, req.params.policyId, req.params.uuid)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/export/file') + @HttpCode(HttpStatus.OK) + async getPolicyExportFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policyFile: any = await engineService.exportFile(req.user, req.params.policyId); + const policy: any = await engineService.getPolicy({ filters: req.params.policyId }); + res.setHeader('Content-disposition', `attachment; filename=${policy.name}`); + res.setHeader('Content-type', 'application/zip'); + return res.send(policyFile); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Get('/:policyId/export/message') + @HttpCode(HttpStatus.OK) + async getPolicyExportMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.exportMessage(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } + + @Post('/import/message') + @HttpCode(HttpStatus.CREATED) + async importPolicyFromMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; + try { + const policies = await engineService.importMessage(req.user, req.body.messageId, versionOfTopicId); + return res.status(201).send(policies); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); -policyAPI.get('/:policyId/dry-run/artifacts', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); + @Post('/push/import/message') + @HttpCode(HttpStatus.ACCEPTED) + async importPolicyFromMessageAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Import policy message'); + + const user = req.user; + const messageId = req.body.messageId; + const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.importMessageAsync(user, messageId, versionOfTopicId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); + }); + return res.status(202).send({ taskId, expectation }); + } + + @Post('/import/file') + @HttpCode(HttpStatus.CREATED) + async importPolicyFromFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; + try { + const policies = await engineService.importFile(req.user, req.body, versionOfTopicId); + return res.status(201).send(policies); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); + } + + @Post('/push/import/file') + @HttpCode(HttpStatus.ACCEPTED) + async importPolicyFromFileAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Import policy file'); + + const user = req.user; + const zip = req.body; + const versionOfTopicId = req.query ? req.query.versionOfTopicId : null; + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.importFileAsync(user, zip, versionOfTopicId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); + }); + return res.status(202).send({ taskId, expectation }); + } + + @Post('/import/message/preview') + @HttpCode(HttpStatus.OK) + async importMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.importMessagePreview(req.user, req.body.messageId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } + + @Post('/push/import/message/preview') + @HttpCode(HttpStatus.ACCEPTED) + async importFromMessagePreview(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Preview policy message'); + + const user = req.user; + const messageId = req.body.messageId; + RunFunctionAsync(async () => { + const engineService = new PolicyEngine(); + await engineService.importMessagePreviewAsync(user, messageId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: 'Unknown error: ' + error.message }); + }); + + return res.status(202).send({ taskId, expectation }); + } - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; + @Post('/import/file/preview') + @HttpCode(HttpStatus.OK) + async importPolicyFromFilePreview(@Req() req: RawBodyRequest, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.importFilePreview(req.user, req.body)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'artifacts', pageIndex, pageSize); - return res.setHeader('X-Total-Count', count).json(data); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -policyAPI.get('/:policyId/dry-run/ipfs', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; - if (!policy) { - return next(createError(404, 'Policy does not exist.')); - } - if (policy.owner !== req.user.did) { - return next(createError(403, 'Invalid owner.')); + @Get('/blocks/about') + @HttpCode(HttpStatus.OK) + async getBlockAbout(@Req() req, @Response() res) { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.blockAbout()); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'ipfs', pageIndex, pageSize) - return res.setHeader('X-Total-Count', count).json(data); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Get('/:policyId/dry-run/users') + @HttpCode(HttpStatus.OK) + async getDryRunUsers(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + return res.send(await engineService.getVirtualUsers(req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/dry-run/user') + @HttpCode(HttpStatus.CREATED) + async setDryRunUser(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + return res.status(201).send(await engineService.createVirtualUser(req.params.policyId, req.user.did)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/dry-run/login') + @HttpCode(HttpStatus.OK) + async loginDryRunUser(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + return res.send(await engineService.loginVirtualUser(req.params.policyId, req.body.did)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/dry-run/restart') + @HttpCode(HttpStatus.OK) + async restartDryRun(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + return res.json(await engineService.restartDryRun(req.body, req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/dry-run/transactions') + @HttpCode(HttpStatus.OK) + async getDryRunTransactions(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'transactions', pageIndex, pageSize) + return res.setHeader('X-Total-Count', count).json(data); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/dry-run/artifacts') + @HttpCode(HttpStatus.OK) + async getDryRunArtifacts(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'artifacts', pageIndex, pageSize); + return res.setHeader('X-Total-Count', count).json(data); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/dry-run/ipfs') + @HttpCode(HttpStatus.OK) + async getDryRunIpfs(@Req() req, @Response() res) { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const engineService = new PolicyEngine(); + try { + const policy = await engineService.getPolicy({ filters: req.params.policyId }) as any; + if (!policy) { + throw new HttpException('Policy does not exist.', HttpStatus.NOT_FOUND) + } + if (policy.owner !== req.user.did) { + throw new HttpException('Invalid owner.', HttpStatus.FORBIDDEN) + } + + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const [data, count] = await engineService.getVirtualDocuments(req.params.policyId, 'ipfs', pageIndex, pageSize) + return res.setHeader('X-Total-Count', count).json(data); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Get('/:policyId/multiple') + @HttpCode(HttpStatus.OK) + async getMultiplePolicies(@Req() req, @Response() res) { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.getMultiPolicy(req.user, req.params.policyId)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/:policyId/multiple/') + @HttpCode(HttpStatus.OK) + async setMultiplePolicies(@Req() req, @Response() res) { + const engineService = new PolicyEngine(); + try { + return res.send(await engineService.setMultiPolicy(req.user, req.params.policyId, req.body)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); - -policyAPI.get('/:policyId/multiple', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.getMultiPolicy(req.user, req.params.policyId)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -policyAPI.post('/:policyId/multiple/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const engineService = new PolicyEngine(); - try { - res.send(await engineService.setMultiPolicy(req.user, req.params.policyId, req.body)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); +} diff --git a/api-gateway/src/api/service/profile.ts b/api-gateway/src/api/service/profile.ts index b107716f33..63d06c1494 100644 --- a/api-gateway/src/api/service/profile.ts +++ b/api-gateway/src/api/service/profile.ts @@ -1,171 +1,177 @@ import { Guardians } from '@helpers/guardians'; import { Users } from '@helpers/users'; -import { Request, Response, Router, NextFunction } from 'express'; -import { - DidDocumentStatus, - IUser, - SchemaEntity, - TopicType, UserRole -} from '@guardian/interfaces'; -import { AuthenticatedRequest, Logger, RunFunctionAsync } from '@guardian/common'; +import { DidDocumentStatus, IUser, SchemaEntity, TopicType, UserRole } from '@guardian/interfaces'; +import { Logger, RunFunctionAsync } from '@guardian/common'; import { TaskManager } from '@helpers/task-manager'; -import { permissionHelper } from '@auth/authorization-helper'; import { ServiceError } from '@helpers/service-requests-base'; -import createError from 'http-errors'; +import { Controller, Get, HttpCode, HttpException, HttpStatus, Put, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; -/** - * User profile route - */ -export const profileAPI = Router(); +@Controller('profiles') +export class ProfileApi { + @Get('/:username/') + @HttpCode(HttpStatus.OK) + async getProfile(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const users = new Users(); -profileAPI.get('/:username/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const users = new Users(); + const user = await users.getUser(req.user.username); - const user = await users.getUser(req.user.username); - - let didDocument: any = null; - if (user.did) { - const didDocuments = await guardians.getDidDocuments({ did: user.did }); - if (didDocuments) { - didDocument = didDocuments[didDocuments.length - 1]; + let didDocument: any = null; + if (user.did) { + const didDocuments = await guardians.getDidDocuments({ did: user.did }); + if (didDocuments) { + didDocument = didDocuments[didDocuments.length - 1]; + } } - } - let vcDocument: any = null; - if (user.did) { - let vcDocuments = await guardians.getVcDocuments({ - owner: user.did, - type: SchemaEntity.USER - }); - if (vcDocuments && vcDocuments.length) { - vcDocument = vcDocuments[vcDocuments.length - 1]; + let vcDocument: any = null; + if (user.did) { + let vcDocuments = await guardians.getVcDocuments({ + owner: user.did, + type: SchemaEntity.USER + }); + if (vcDocuments && vcDocuments.length) { + vcDocument = vcDocuments[vcDocuments.length - 1]; + } + vcDocuments = await guardians.getVcDocuments({ + owner: user.did, + type: SchemaEntity.STANDARD_REGISTRY + }); + if (vcDocuments && vcDocuments.length) { + vcDocument = vcDocuments[vcDocuments.length - 1]; + } } - vcDocuments = await guardians.getVcDocuments({ - owner: user.did, - type: SchemaEntity.STANDARD_REGISTRY - }); - if (vcDocuments && vcDocuments.length) { - vcDocument = vcDocuments[vcDocuments.length - 1]; + + let topic: any; + if (user.did || user.parent) { + const filters = []; + if (user.did) { + filters.push(user.did); + } + if (user.parent) { + filters.push(user.parent); + } + topic = await guardians.getTopic({ + type: TopicType.UserTopic, + owner: { $in: filters } + }); } + + const result: IUser = { + username: user.username, + role: user.role, + did: user.did, + parent: user.parent, + hederaAccountId: user.hederaAccountId, + confirmed: !!(didDocument && didDocument.status === DidDocumentStatus.CREATE), + failed: !!(didDocument && didDocument.status === DidDocumentStatus.FAILED), + hederaAccountKey: null, + topicId: topic?.topicId, + parentTopicId: topic?.parent, + didDocument, + vcDocument + }; + return res.json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } - let topic: any; - if (user.did || user.parent) { - const filters = []; - if (user.did) { - filters.push(user.did); - } - if (user.parent) { - filters.push(user.parent); - } - topic = await guardians.getTopic({ - type: TopicType.UserTopic, - owner: { $in: filters } - }); + @Put('/:username') + @HttpCode(HttpStatus.NO_CONTENT) + async setUserProfile(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + + const profile: any = req.body; + const username: string = req.user.username; + + await guardians.createUserProfileCommon(username, profile); + + return res.status(204).send(); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } + + @Put('/push/:username') + @HttpCode(HttpStatus.ACCEPTED) + async setUserProfileAsync(@Req() req, @Response() res): Promise { + const taskManager = new TaskManager(); + const {taskId, expectation} = taskManager.start('Connect user'); - const result: IUser = { - username: user.username, - role: user.role, - did: user.did, - parent: user.parent, - hederaAccountId: user.hederaAccountId, - confirmed: !!(didDocument && didDocument.status === DidDocumentStatus.CREATE), - failed: !!(didDocument && didDocument.status === DidDocumentStatus.FAILED), - hederaAccountKey: null, - topicId: topic?.topicId, - parentTopicId: topic?.parent, - didDocument, - vcDocument - }; - return res.json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + const profile: any = req.body; + const username: string = req.user.username; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.createUserProfileCommonAsync(username, profile, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, {code: error.code || 500, message: error.message}); + }); + + return res.status(202).send({taskId, expectation}); } -}); -profileAPI.put('/:username', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Put('/restore/:username') + @HttpCode(HttpStatus.ACCEPTED) + async resoreUserProfile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const {taskId, expectation} = taskManager.start('Restore user profile'); const profile: any = req.body; const username: string = req.user.username; - await guardians.createUserProfileCommon(username, profile); + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.restoreUserProfileCommonAsync(username, profile, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, {code: error.code || 500, message: error.message}); + }) - return res.status(204).send(); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + return res.status(202).send({taskId, expectation}); } -}); - -profileAPI.put('/push/:username', async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const {taskId, expectation} = taskManager.start('Connect user'); - - const profile: any = req.body; - const username: string = req.user.username; - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.createUserProfileCommonAsync(username, profile, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, {code: error.code || 500, message: error.message}); - }); - - return res.status(202).send({taskId, expectation}); -}); - -profileAPI.put('/restore/:username', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const {taskId, expectation} = taskManager.start('Restore user profile'); - - const profile: any = req.body; - const username: string = req.user.username; - - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.restoreUserProfileCommonAsync(username, profile, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, {code: error.code || 500, message: error.message}); - }) - - return res.status(202).send({taskId, expectation}); -}); - -profileAPI.put('/restore/topics/:username', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const {taskId, expectation} = taskManager.start('Get user topics'); - - const profile: any = req.body; - const username: string = req.user.username; - - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.getAllUserTopicsAsync(username, profile, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, {code: error.code || 500, message: error.message}); - }) - - return res.status(202).send({taskId, expectation}); -}); - -profileAPI.get('/:username/balance', async (req: Request, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const balance = await guardians.getUserBalance(req.params.username); - if (balance.toLowerCase().includes('invalid account')) { - return next(createError(404, 'Account not found')); + + @Put('/restore/topics/:username') + @HttpCode(HttpStatus.ACCEPTED) + async restoreTopic(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const {taskId, expectation} = taskManager.start('Get user topics'); + + const profile: any = req.body; + const username: string = req.user.username; + + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.getAllUserTopicsAsync(username, profile, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, {code: error.code || 500, message: error.message}); + }) + + return res.status(202).send({taskId, expectation}); + } + + @Get('/:username/balance') + @HttpCode(HttpStatus.OK) + async getUserBalance(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const balance = await guardians.getUserBalance(req.params.username); + if (balance.toLowerCase().includes('invalid account')) { + throw new HttpException('Account not found', HttpStatus.NOT_FOUND) + } + return res.json(balance); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - return res.json(balance); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); +} diff --git a/api-gateway/src/api/service/schema.ts b/api-gateway/src/api/service/schema.ts index 14f1d7fdb1..87d5b92ee9 100644 --- a/api-gateway/src/api/service/schema.ts +++ b/api-gateway/src/api/service/schema.ts @@ -1,23 +1,14 @@ import { Guardians } from '@helpers/guardians'; -import { NextFunction, Request, Response, Router } from 'express'; -import { - ISchema, - SchemaCategory, - SchemaEntity, - SchemaHelper, - SchemaStatus, - StatusType, - UserRole -} from '@guardian/interfaces'; -import { permissionHelper } from '@auth/authorization-helper'; -import { AuthenticatedRequest, Logger, RunFunctionAsync } from '@guardian/common'; +import { ISchema, SchemaCategory, SchemaEntity, SchemaHelper, SchemaStatus, StatusType, UserRole } from '@guardian/interfaces'; +import { Logger, RunFunctionAsync } from '@guardian/common'; import { PolicyEngine } from '@helpers/policy-engine'; import { TaskManager } from '@helpers/task-manager'; import { ServiceError } from '@helpers/service-requests-base'; import { SchemaUtils } from '@helpers/schema-utils'; -import createError from 'http-errors'; -import validate from '@middlewares/validation'; -import { schemaSchema, systemEntitySchema } from '@middlewares/validation/schemas/schemas'; +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; +import { Client, ClientProxy, Transport } from '@nestjs/microservices'; +import process from 'process'; /** * Prepare new schema object @@ -110,220 +101,246 @@ export async function updateSchema(newSchema: ISchema, owner: string): Promise { + try { + const user = req.user; + const schemaId = req.params.schemaId; + const guardians = new Guardians(); + const schema = await guardians.getSchemaById(schemaId); + if (!schema) { + throw new HttpException('Schema not found', HttpStatus.NOT_FOUND) + } + let owner = user.parent; + if (user.role === UserRole.STANDARD_REGISTRY) { + owner = user.did; + } + if (!schema.system && schema.owner && schema.owner !== owner) { + throw new HttpException('Invalid creator.', HttpStatus.FORBIDDEN) -singleSchemaRoute.get('/:schemaId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const schemaId = req.params.schemaId; - const guardians = new Guardians(); - const schema = await guardians.getSchemaById(schemaId); - if (!schema) { - return next(createError(404, 'Schema not found')); - } - let owner = user.parent; - if (user.role === UserRole.STANDARD_REGISTRY) { - owner = user.did; + } + if (schema.system) { + schema.readonly = schema.readonly || schema.owner !== owner; + } else { + SchemaHelper.updatePermission([schema], owner); + } + return res.json(SchemaUtils.toOld(schema)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - if (!schema.system && schema.owner && schema.owner !== owner) { - return next(createError(403, 'Invalid creator.')); + } +} + +@Controller('schemas') +export class SchemaApi { + + @Client({ + transport: Transport.NATS, + options: { + // name: `${process.env.SERVICE_CHANNEL}`, + servers: [ + `nats://${process.env.MQ_ADDRESS}:4222` + ] } - if (schema.system) { - schema.readonly = schema.readonly || schema.owner !== owner; - } else { - SchemaHelper.updatePermission([schema], owner); + }) + client: ClientProxy; + + @Post('/:topicId') + @HttpCode(HttpStatus.CREATED) + async setTopicId(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; + SchemaUtils.fromOld(newSchema); + const topicId = req.params.topicId; + const schemas = await createSchema( + newSchema, + user.did, + topicId, + ); + return res.status(201).json(SchemaUtils.toOld(schemas)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - res.json(SchemaUtils.toOld(schema)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -/** - * Schema route - */ -export const schemaAPI = Router(); + @Post('/push/:topicId') + @HttpCode(HttpStatus.ACCEPTED) + async setTopicIdAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create schema'); -schemaAPI.post('/:topicId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { const user = req.user; const newSchema = req.body; - SchemaUtils.fromOld(newSchema); const topicId = req.params.topicId; - const schemas = await createSchema(newSchema, user.did, topicId); - return res.status(201).json(SchemaUtils.toOld(schemas)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + RunFunctionAsync(async () => { + SchemaUtils.fromOld(newSchema); + await createSchemaAsync( + newSchema, + user.did, + topicId, + taskId, + ); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); } -}); -schemaAPI.post('/push/:topicId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Create schema'); - - const user = req.user; - const newSchema = req.body; - const topicId = req.params.topicId; - RunFunctionAsync(async () => { - SchemaUtils.fromOld(newSchema); - await createSchemaAsync(newSchema, user.did, topicId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); - - res.status(202).send({ taskId, expectation }); -}); + @Get('/') + @HttpCode(HttpStatus.OK) + async getSchemas(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const { guardians, pageIndex, pageSize, owner } = prepareSchemaPagination(req, user); + let topicId = null; + const policyId = req.query?.policyId; + if (policyId) { + const engineService = new PolicyEngine(); + const model = (await engineService.getPolicy({ + filters: policyId, + userDid: user.did, + })); + topicId = model?.topicId; + } -/** - * Prepare the schema pagination - * - * @param req - * @param user - */ -function prepareSchemaPagination(req, user) { - const guardians = new Guardians(); - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - let owner = user.parent; - if (user.role === UserRole.STANDARD_REGISTRY) { - owner = user.did; + const { items, count } = await guardians.getSchemasByOwner(owner, topicId, pageIndex, pageSize); + // const result = await this.client.send(MessageAPI.GET_SCHEMAS, { + // owner, + // topicId, + // pageIndex, + // pageSize + // }).toPromise(); + // const { items, count } = result.body; + SchemaHelper.updatePermission(items, user.did); + return res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } - return { guardians, pageIndex, pageSize, owner }; -} -schemaAPI.get('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const { guardians, pageIndex, pageSize, owner } = prepareSchemaPagination(req, user); - let topicId = null; - const policyId = req.query?.policyId; - if (policyId) { - const engineService = new PolicyEngine(); - const model = (await engineService.getPolicy({ - filters: policyId, - userDid: user.did, - })); - topicId = model?.topicId; + @Get('/:topicId') + @HttpCode(HttpStatus.OK) + async getByTopicId(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const { topicId } = req.params; + const { guardians, pageIndex, pageSize, owner } = prepareSchemaPagination(req, user); + const { items, count } = await guardians.getSchemasByOwner(owner, topicId, pageIndex, pageSize); + SchemaHelper.updatePermission(items, user.did); + return res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - - const { items, count } = await guardians.getSchemasByOwner(owner, topicId, pageIndex, pageSize); - SchemaHelper.updatePermission(items, user.did); - res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.get('/:topicId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const { topicId } = req.params; - const { guardians, pageIndex, pageSize, owner } = prepareSchemaPagination(req, user); - const { items, count } = await guardians.getSchemasByOwner(owner, topicId, pageIndex, pageSize); - SchemaHelper.updatePermission(items, user.did); - res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -schemaAPI.put('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const newSchema = req.body; - const guardians = new Guardians(); - const schema = await guardians.getSchemaById(newSchema.id); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); - if (error) { - return next(createError(403, error)); - } - if (schema.status === SchemaStatus.PUBLISHED) { - return next(createError(422, 'Schema is published.')); + @Put('/') + @HttpCode(HttpStatus.OK) + async setSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; + const guardians = new Guardians(); + const schema = await guardians.getSchemaById(newSchema.id); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND) + } + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); + if (error) { + throw new HttpException(error, HttpStatus.FORBIDDEN) + } + if (schema.status === SchemaStatus.PUBLISHED) { + throw new HttpException('Schema is published.', HttpStatus.UNPROCESSABLE_ENTITY) + } + SchemaUtils.fromOld(newSchema); + const schemas = await updateSchema(newSchema, user.did); + return res.json(SchemaUtils.toOld(schemas)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - SchemaUtils.fromOld(newSchema); - const schemas = await updateSchema(newSchema, user.did); - res.json(SchemaUtils.toOld(schemas)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.delete('/:schemaId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); - if (error) { - return next(createError(403, error)); - } - if (schema.status === SchemaStatus.PUBLISHED) { - return next(createError(422, 'Schema is published.')); + @Delete('/:schemaId') + @HttpCode(HttpStatus.OK) + async deleteSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND) + } + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); + if (error) { + throw new HttpException(error, HttpStatus.FORBIDDEN) + } + if (schema.status === SchemaStatus.PUBLISHED) { + throw new HttpException('Schema is published.', HttpStatus.UNPROCESSABLE_ENTITY) + } + const schemas = (await guardians.deleteSchema(schemaId, true) as ISchema[]); + SchemaHelper.updatePermission(schemas, user.did); + return res.json(SchemaUtils.toOld(schemas)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const schemas = (await guardians.deleteSchema(schemaId, true) as ISchema[]); - SchemaHelper.updatePermission(schemas, user.did); - res.json(SchemaUtils.toOld(schemas)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.put('/:schemaId/publish', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); - if (error) { - return next(createError(403, error)); - } - if (schema.status === SchemaStatus.PUBLISHED) { - return next(createError(422, 'Schema is published.')); - } - const allVersion = await guardians.getSchemasByUUID(schema.uuid); - const { version } = req.body; - if (allVersion.findIndex(s => s.version === version) !== -1) { - return next(createError(422, 'Version already exists.')); - } + @Put('/:schemaId/publish') + @HttpCode(HttpStatus.OK) + async publishSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND) + } + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); + if (error) { + throw new HttpException(error, HttpStatus.FORBIDDEN) + } + if (schema.status === SchemaStatus.PUBLISHED) { + throw new HttpException('Schema is published.', HttpStatus.UNPROCESSABLE_ENTITY) + } + const allVersion = await guardians.getSchemasByUUID(schema.uuid); + const { version } = req.body; + if (allVersion.findIndex(s => s.version === version) !== -1) { + throw new HttpException('Version already exists.', HttpStatus.UNPROCESSABLE_ENTITY) + } - await guardians.publishSchema(schemaId, version, user.did); + await guardians.publishSchema(schemaId, version, user.did); - const { items, count } = await guardians.getSchemasByOwner(user.did); - SchemaHelper.updatePermission(items, user.did); - res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + const { items, count } = await guardians.getSchemasByOwner(user.did); + SchemaHelper.updatePermission(items, user.did); + return res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -schemaAPI.put('/push/:schemaId/publish', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { + @Put('/push/:schemaId/publish') + @HttpCode(HttpStatus.ACCEPTED) + async publishSchemaAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); const taskManager = new TaskManager(); const { taskId, expectation } = taskManager.start('Publish schema'); @@ -332,11 +349,11 @@ schemaAPI.put('/push/:schemaId/publish', permissionHelper(UserRole.STANDARD_REGI const guardians = new Guardians(); const schema = await guardians.getSchemaById(schemaId); if (!schema) { - return next(createError(404, 'Schema not found')); + throw new HttpException('Schema not found', HttpStatus.NOT_FOUND) } const notAllowed = SchemaUtils.checkPermission(schema, user, SchemaCategory.POLICY); if (notAllowed) { - return next(createError(403, notAllowed)); + throw new HttpException(notAllowed, HttpStatus.FORBIDDEN) } const version = req.body.version; RunFunctionAsync(async () => { @@ -356,66 +373,69 @@ schemaAPI.put('/push/:schemaId/publish', permissionHelper(UserRole.STANDARD_REGI taskManager.addError(taskId, { code: 500, message: error.message }); }); - res.status(202).send({ taskId, expectation }); - }); + return res.status(202).send({ taskId, expectation }); + } -schemaAPI.post('/import/message/preview', [ - validate(schemaSchema()), permissionHelper(UserRole.STANDARD_REGISTRY) -], async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const messageId = req.body.messageId; - const guardians = new Guardians(); - const schemaToPreview = await guardians.previewSchemasByMessages([messageId]); - return res.json(schemaToPreview); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Post('/import/message/preview') + @HttpCode(HttpStatus.OK) + async importFromMessagePreview(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const messageId = req.body.messageId; + const guardians = new Guardians(); + const schemaToPreview = await guardians.previewSchemasByMessages([messageId]); + return res.json(schemaToPreview); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -schemaAPI.post('/push/import/message/preview', [ - validate(schemaSchema()), permissionHelper(UserRole.STANDARD_REGISTRY) -], async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Preview schema message'); + @Post('/push/import/message/preview') + @HttpCode(HttpStatus.ACCEPTED) + async importFromMessagePreviewAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Preview schema message'); - const messageId = req.body.messageId; - RunFunctionAsync(async () => { - if (!messageId) { - throw new Error('Schema ID in body is empty'); - } - const guardians = new Guardians(); - await guardians.previewSchemasByMessagesAsync([messageId], taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); + const messageId = req.body.messageId; + RunFunctionAsync(async () => { + if (!messageId) { + throw new Error('Schema ID in body is empty'); + } + const guardians = new Guardians(); + await guardians.previewSchemasByMessagesAsync([messageId], taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); - res.status(202).send({ taskId, expectation }); -}); + return res.status(202).send({ taskId, expectation }); + } -schemaAPI.post('/import/file/preview', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const zip = req.body; - if (!zip) { - return next(createError(422, 'File in body is empty')); + @Post('/import/file/preview') + @HttpCode(HttpStatus.OK) + async importFromFilePreview(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const zip = req.body; + if (!zip) { + throw new HttpException('File in body is empty', HttpStatus.UNPROCESSABLE_ENTITY) + } + const guardians = new Guardians(); + const { schemas } = await SchemaUtils.parseZipFile(zip); + const schemaToPreview = await guardians.previewSchemasByFile(schemas); + return res.json(schemaToPreview); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - const guardians = new Guardians(); - const { schemas } = await SchemaUtils.parseZipFile(zip); - const schemaToPreview = await guardians.previewSchemasByFile(schemas); - res.json(schemaToPreview); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -schemaAPI.post('/:topicId/import/message', - [ - validate(schemaSchema()), - permissionHelper(UserRole.STANDARD_REGISTRY) - ] - , async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { + } + + @Post('/:topicId/import/message') + @HttpCode(HttpStatus.CREATED) + async importFromMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); try { const user = req.user; const topicId = req.params.topicId; @@ -424,191 +444,204 @@ schemaAPI.post('/:topicId/import/message', await guardians.importSchemasByMessages([messageId], req.user.did, topicId); const { items, count } = await guardians.getSchemasByOwner(user.did); SchemaHelper.updatePermission(items, user.did); - res.status(201).setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + return res.status(201).setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); } catch (error) { new Logger().error(error, ['API_GATEWAY']); - return next(error); + throw error; } - }); + } -schemaAPI.post('/push/:topicId/import/message', [ - validate(schemaSchema()), - permissionHelper(UserRole.STANDARD_REGISTRY) -], async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Import schema message'); + @Post('/push/:topicId/import/message') + @HttpCode(HttpStatus.ACCEPTED) + async importFromMessageAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Import schema message'); - const user = req.user; - const topicId = req.params.topicId; - const messageId = req.body.messageId; - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.importSchemasByMessagesAsync([messageId], user.did, topicId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); + const user = req.user; + const topicId = req.params.topicId; + const messageId = req.body.messageId; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.importSchemasByMessagesAsync([messageId], user.did, topicId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); + } + + @Post('/:topicId/import/file') + @HttpCode(HttpStatus.CREATED) + async importToTopicFromFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const zip = req.body; + const topicId = req.params.topicId; + if (!zip) { + throw new HttpException('File in body is empty', HttpStatus.UNPROCESSABLE_ENTITY) + } + const files = await SchemaUtils.parseZipFile(zip); + await guardians.importSchemasByFile(files, req.user.did, topicId); + const { items, count } = await guardians.getSchemasByOwner(user.did); + SchemaHelper.updatePermission(items, user.did); + return res.status(201).setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } + } - res.status(202).send({ taskId, expectation }); -}); + @Post('/push/:topicId/import/file') + @HttpCode(HttpStatus.ACCEPTED) + async importToTopicFromFileAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Import schema file'); -schemaAPI.post('/:topicId/import/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { const user = req.user; - const guardians = new Guardians(); const zip = req.body; - const topicId = req.params.topicId; if (!zip) { - return next(createError(422, 'File in body is empty')); + throw new HttpException('File in body is empty', HttpStatus.UNPROCESSABLE_ENTITY) } - const files = await SchemaUtils.parseZipFile(zip); - await guardians.importSchemasByFile(files, req.user.did, topicId); - const { items, count } = await guardians.getSchemasByOwner(user.did); - SchemaHelper.updatePermission(items, user.did); - res.status(201).setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -schemaAPI.post('/push/:topicId/import/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Import schema file'); - - const user = req.user; - const zip = req.body; - if (!zip) { - return next(createError(422, 'File in body is empty')); - } - const topicId = req.params.topicId; - RunFunctionAsync(async () => { - taskManager.addStatus(taskId, 'Parse file', StatusType.PROCESSING); - const files = await SchemaUtils.parseZipFile(zip); - taskManager.addStatus(taskId, 'Parse file', StatusType.COMPLETED); - const guardians = new Guardians(); - await guardians.importSchemasByFileAsync(files, user.did, topicId, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: 500, message: error.message }); - }); + const topicId = req.params.topicId; + RunFunctionAsync(async () => { + taskManager.addStatus(taskId, 'Parse file', StatusType.PROCESSING); + const files = await SchemaUtils.parseZipFile(zip); + taskManager.addStatus(taskId, 'Parse file', StatusType.COMPLETED); + const guardians = new Guardians(); + await guardians.importSchemasByFileAsync(files, user.did, topicId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: 500, message: error.message }); + }); - res.status(202).send({ taskId, expectation }); -}); + return res.status(202).send({ taskId, expectation }); + } -schemaAPI.get('/:schemaId/export/message', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: Request, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const id = req.params.schemaId; - const schemas = await guardians.exportSchemas([id]); - const scheme = schemas[0]; - if (!scheme) { - return next(createError(422, `Cannot export policy ${req.params.schemaId}`)); + @Get('/:schemaId/export/message') + @HttpCode(HttpStatus.OK) + async exportMessage(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const id = req.params.schemaId; + const schemas = await guardians.exportSchemas([id]); + const scheme = schemas[0]; + if (!scheme) { + throw new HttpException(`Cannot export schema ${req.params.schemaId}`, HttpStatus.UNPROCESSABLE_ENTITY); + } + return res.send({ + id: scheme.id, + name: scheme.name, + description: scheme.description, + version: scheme.version, + messageId: scheme.messageId, + owner: scheme.owner + }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - res.send({ - id: scheme.id, - name: scheme.name, - description: scheme.description, - version: scheme.version, - messageId: scheme.messageId, - owner: scheme.owner - }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.get('/:schemaId/export/file', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const id = req.params.schemaId; - const schemas = await guardians.exportSchemas([id]); - if (!schemas || !schemas.length) { - return next(createError(422, `Cannot export policy ${req.params.schemaId}`)); - } - const ids = schemas.map(s => s.id); - const tags = await guardians.exportTags('Schema', ids); - const name = `${Date.now()}`; - const zip = await SchemaUtils.generateZipFile(schemas, tags); - const arcStream = zip.generateNodeStream({ - type: 'nodebuffer', - compression: 'DEFLATE', - compressionOptions: { - level: 3 + @Get('/:schemaId/export/file') + @HttpCode(HttpStatus.OK) + async exportToFile(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const id = req.params.schemaId; + const schemas = await guardians.exportSchemas([id]); + if (!schemas || !schemas.length) { + throw new HttpException(`Cannot export schema ${req.params.schemaId}`, HttpStatus.UNPROCESSABLE_ENTITY) } - }); - res.setHeader('Content-disposition', `attachment; filename=${name}`); - res.setHeader('Content-type', 'application/zip'); - arcStream.pipe(res); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + const ids = schemas.map(s => s.id); + const tags = await guardians.exportTags('Schema', ids); + const name = `${Date.now()}`; + const zip = await SchemaUtils.generateZipFile(schemas, tags); + const arcStream = zip.generateNodeStream({ + type: 'nodebuffer', + compression: 'DEFLATE', + compressionOptions: { + level: 3 + } + }); + res.setHeader('Content-disposition', `attachment; filename=${name}`); + res.setHeader('Content-type', 'application/zip'); + arcStream.pipe(res); + return res; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -schemaAPI.get('/type/:schemaType', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const schema = await guardians.getSchemaByType(req.params.schemaType); - if (!schema) { - return next(createError(404, `Schema not found: ${req.params.schemaType}`)); + @Get('/type/:schemaType') + @HttpCode(HttpStatus.OK) + async getSchemaType(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const schema = await guardians.getSchemaByType(req.params.schemaType); + if (!schema) { + throw new HttpException( `Schema not found: ${req.params.schemaType}`, HttpStatus.NOT_FOUND); + } + return res.send({ + uuid: schema.uuid, + iri: schema.iri, + name: schema.name, + version: schema.version, + document: schema.document, + documentURL: schema.documentURL, + context: schema.context, + contextURL: schema.contextURL, + }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + return error } - res.send({ - uuid: schema.uuid, - iri: schema.iri, - name: schema.name, - version: schema.version, - document: schema.document, - documentURL: schema.documentURL, - context: schema.context, - contextURL: schema.contextURL, - }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -schemaAPI.post('/system/:username', [ - validate(systemEntitySchema()), - permissionHelper(UserRole.STANDARD_REGISTRY) -], async ( - req: AuthenticatedRequest, res: Response, next: NextFunction -) => { - try { - const user = req.user; - const newSchema = req.body; + } - if (newSchema.entity !== SchemaEntity.STANDARD_REGISTRY - && newSchema.entity !== SchemaEntity.USER) { - return next(createError(422, - `Invalid schema types. Entity must be ${SchemaEntity.STANDARD_REGISTRY} or ${SchemaEntity.USER}` - )); - } + @Post('/system/:username') + @HttpCode(HttpStatus.CREATED) + async postSystemSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; - const guardians = new Guardians(); - const owner = user.username; + if (newSchema.entity !== SchemaEntity.STANDARD_REGISTRY + && newSchema.entity !== SchemaEntity.USER) { + throw new HttpException(`Invalid schema types. Entity must be ${SchemaEntity.STANDARD_REGISTRY} or ${SchemaEntity.USER}`, HttpStatus.UNPROCESSABLE_ENTITY) + } - SchemaUtils.fromOld(newSchema); - delete newSchema.version; - delete newSchema.id; - delete newSchema._id; - delete newSchema.status; - delete newSchema.topicId; + const guardians = new Guardians(); + const owner = user.username; - SchemaHelper.updateOwner(newSchema, owner); - const schema = await guardians.createSystemSchema(newSchema); + SchemaUtils.fromOld(newSchema); + delete newSchema.version; + delete newSchema.id; + delete newSchema._id; + delete newSchema.status; + delete newSchema.topicId; - res.status(201).json(SchemaUtils.toOld(schema)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + SchemaHelper.updateOwner(newSchema, owner); + const schema = await guardians.createSystemSchema(newSchema); + + return res.status(201).json(SchemaUtils.toOld(schema)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -schemaAPI.get('/system/:username', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { + @Get('/system/:username') + @HttpCode(HttpStatus.OK) + async getSystemSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); try { const user = req.user; const guardians = new Guardians(); @@ -621,118 +654,154 @@ schemaAPI.get('/system/:username', permissionHelper(UserRole.STANDARD_REGISTRY), } const { items, count } = await guardians.getSystemSchemas(owner, pageIndex, pageSize); items.forEach((s) => { s.readonly = s.readonly || s.owner !== owner }); - res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); + return res.setHeader('X-Total-Count', count).json(SchemaUtils.toOld(items)); } catch (error) { new Logger().error(error, ['API_GATEWAY']); - return next(error); + throw error; } - }); + } -schemaAPI.delete('/system/:schemaId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.SYSTEM); - if (error) { - return next(createError(403, error)) - } - if (schema.active) { - return next(createError(422, 'Schema is active.')); + @Delete('/system/:schemaId') + @HttpCode(HttpStatus.NO_CONTENT) + async deleteSystemSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND) + } + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.SYSTEM); + if (error) { + throw new HttpException(error, HttpStatus.FORBIDDEN); + } + if (schema.active) { + throw new HttpException('Schema is active.', HttpStatus.UNPROCESSABLE_ENTITY); + } + await guardians.deleteSchema(schemaId); + return res.status(204).send(); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - await guardians.deleteSchema(schemaId); - res.status(204).send(); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.put('/system/:schemaId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const newSchema = req.body; - const guardians = new Guardians(); - const schema = await guardians.getSchemaById(newSchema.id); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.SYSTEM); - if (error) { - return next(createError(403, error)) - } - if (schema.active) { - return next(createError(422, 'Schema is active.')); + @Put('/system/:schemaId') + @HttpCode(HttpStatus.OK) + async setSystemSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; + const guardians = new Guardians(); + const schema = await guardians.getSchemaById(newSchema.id); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND); + } + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.SYSTEM); + if (error) { + throw new HttpException(error, HttpStatus.FORBIDDEN); + } + if (schema.active) { + throw new HttpException('Schema is active.', HttpStatus.UNPROCESSABLE_ENTITY); + } + SchemaUtils.fromOld(newSchema); + const schemas = await updateSchema(newSchema, user.username); + return res.json(SchemaUtils.toOld(schemas)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - SchemaUtils.fromOld(newSchema); - const schemas = await updateSchema(newSchema, user.username); - res.json(SchemaUtils.toOld(schemas)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.put('/system/:schemaId/active', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - if (!schema) { - return next(createError(404, 'Schema not found.')); - } - if (!schema.system) { - return next(createError(403, 'Schema is not system.')); - } - if (schema.active) { - return next(createError(422, 'Schema is active.')); + @Put('/system/:schemaId/active') + @HttpCode(HttpStatus.OK) + async activeSystemSchema(@Req() req: any): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + if (!schema) { + throw new HttpException('Schema not found.', HttpStatus.NOT_FOUND); + } + if (!schema.system) { + throw new HttpException('Schema not found.', HttpStatus.FORBIDDEN); + } + if (schema.active) { + throw new HttpException('Schema is active.', HttpStatus.UNPROCESSABLE_ENTITY); + } + await guardians.activeSchema(schemaId); + return null; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - await guardians.activeSchema(schemaId); - return res.json(null); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.get('/system/entity/:schemaEntity', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const schema = await guardians.getSchemaByEntity(req.params.schemaEntity); - if (!schema) { - return res.send(null); + @Get('/system/entity/:schemaEntity') + @HttpCode(HttpStatus.OK) + async getSchemaEntity(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const schema = await guardians.getSchemaByEntity(req.params.schemaEntity); + if (!schema) { + return res.send(null); + } + return res.send({ + uuid: schema.uuid, + iri: schema.iri, + name: schema.name, + version: schema.version, + document: schema.document, + documentURL: schema.documentURL, + context: schema.context, + contextURL: schema.contextURL, + }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - return res.send({ - uuid: schema.uuid, - iri: schema.iri, - name: schema.name, - version: schema.version, - document: schema.document, - documentURL: schema.documentURL, - context: schema.context, - contextURL: schema.contextURL, - }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -schemaAPI.get('/list/all', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - if (user.did) { - const schemas = await guardians.getListSchemas(user.did); - return res.send(schemas); + @Get('/list/all') + @HttpCode(HttpStatus.OK) + async getAll(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + if (user.did) { + const schemas = await guardians.getListSchemas(user.did); + return res.send(schemas); + } + res.send([]); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - res.send([]); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); +} + +/** + * Prepare the schema pagination + * + * @param req + * @param user + */ +function prepareSchemaPagination(req, user) { + const guardians = new Guardians(); + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + let owner = user.parent; + if (user.role === UserRole.STANDARD_REGISTRY) { + owner = user.did; + } + return { guardians, pageIndex, pageSize, owner }; +} diff --git a/api-gateway/src/api/service/settings.ts b/api-gateway/src/api/service/settings.ts index 5aea93d790..cd58a6454a 100644 --- a/api-gateway/src/api/service/settings.ts +++ b/api-gateway/src/api/service/settings.ts @@ -1,56 +1,60 @@ -import { permissionHelper } from '@auth/authorization-helper'; import { Guardians } from '@helpers/guardians'; -import { Request, Response, Router, NextFunction } from 'express'; import { CommonSettings, UserRole } from '@guardian/interfaces'; import { Logger } from '@guardian/common'; -import validate, { prepareValidationResponse } from '@middlewares/validation'; -import { updateSettings } from '@middlewares/validation/schemas/settings'; +import { prepareValidationResponse } from '@middlewares/validation'; +import { Controller, Get, HttpCode, HttpStatus, Post, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; -/** - * Settings route - */ -export const settingsAPI = Router(); - -settingsAPI.post('/', validate(updateSettings()), permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: Request, res: Response, next: NextFunction) => { - try { - const settings = req.body as CommonSettings; - if (!settings || Object.keys(settings).length === 0) { - return res.status(422).json(prepareValidationResponse('Invalid settings')); +@Controller('settings') +export class SettingsApi { + @Post('/') + @HttpCode(HttpStatus.CREATED) + async updateSettings(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const settings = req.body as CommonSettings; + if (!settings || Object.keys(settings).length === 0) { + return res.status(422).json(prepareValidationResponse('Invalid settings')); + } + const guardians = new Guardians(); + await Promise.all([ + guardians.updateSettings(settings) + ]); + return res.status(201).json(null); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - const guardians = new Guardians(); - await Promise.all([ - guardians.updateSettings(settings) - ]); - res.json(null); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -settingsAPI.get('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: Request, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const [guardiansSettings] = await Promise.all([ - guardians.getSettings() - ]); - res.json({ - ...guardiansSettings - }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Get('/') + @HttpCode(HttpStatus.OK) + async getSettings(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const [guardiansSettings] = await Promise.all([ + guardians.getSettings() + ]); + res.json({ + ...guardiansSettings + }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -settingsAPI.get('/environment', async (req: Request, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const environment = await guardians.getEnvironment(); - res.send(environment); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Get('/environment') + @HttpCode(HttpStatus.OK) + async getEnvironment(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const environment = await guardians.getEnvironment(); + return res.send(environment); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}) +} diff --git a/api-gateway/src/api/service/tags.ts b/api-gateway/src/api/service/tags.ts index 65136de628..fb738cafb5 100644 --- a/api-gateway/src/api/service/tags.ts +++ b/api-gateway/src/api/service/tags.ts @@ -1,238 +1,262 @@ -import { Response, Router, NextFunction } from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; -import { permissionHelper } from '@auth/authorization-helper'; import { SchemaCategory, SchemaHelper, UserRole } from '@guardian/interfaces'; import { SchemaUtils } from '@helpers/schema-utils'; -import createError from 'http-errors'; - -/** - * Tags route - */ -export const tagsAPI = Router(); - -tagsAPI.post('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - const item = await guardian.createTag(req.body, req.user.did); - res.status(201).json(item); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); - } -}); - -tagsAPI.post('/search', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const { entity, target, targets } = req.body; - let _targets: string[]; - if (!entity) { - return next(createError(422, 'Invalid entity')); +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; + +@Controller('tags') +export class TagsApi { + @Post('/') + @HttpCode(HttpStatus.CREATED) + async setTags(@Req() req, @Response() res): Promise { + try { + const guardian = new Guardians(); + const item = await guardian.createTag(req.body, req.user.did); + return res.status(201).json(item); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error } - if (target) { - if (typeof target !== 'string') { - return next(createError(422, 'Invalid target')); - } else { - _targets = [target]; + } + + @Post('/search') + @HttpCode(HttpStatus.OK) + async searchTags(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const { entity, target, targets } = req.body; + let _targets: string[]; + if (!entity) { + throw new HttpException('Invalid entity', HttpStatus.UNPROCESSABLE_ENTITY) } - } else if (targets) { - if (!Array.isArray(targets)) { - return next(createError(422, 'Invalid target')); + if (target) { + if (typeof target !== 'string') { + throw new HttpException('Invalid target', HttpStatus.UNPROCESSABLE_ENTITY) + } else { + _targets = [target]; + } + } else if (targets) { + if (!Array.isArray(targets)) { + throw new HttpException('Invalid target', HttpStatus.UNPROCESSABLE_ENTITY) + } else { + _targets = targets; + } } else { - _targets = targets; + throw new HttpException('Invalid target', HttpStatus.UNPROCESSABLE_ENTITY) } - } else { - return next(createError(422, 'Invalid target')); - } - const items = await guardians.getTags(entity, _targets); - const dates = await guardians.getTagCache(entity, _targets); + const items = await guardians.getTags(entity, _targets); + const dates = await guardians.getTagCache(entity, _targets); - const dateMap = {}; - for (const date of dates) { - dateMap[date.localTarget] = date.date; - } + const dateMap = {}; + for (const date of dates) { + dateMap[date.localTarget] = date.date; + } - const tagMap = {}; - for (const tag of items) { - if (tagMap[tag.localTarget]) { - tagMap[tag.localTarget].tags.push(tag); - } else { - tagMap[tag.localTarget] = { - entity, - refreshDate: dateMap[tag.localTarget], - target: tag.localTarget, - tags: [tag] + const tagMap = {}; + for (const tag of items) { + if (tagMap[tag.localTarget]) { + tagMap[tag.localTarget].tags.push(tag); + } else { + tagMap[tag.localTarget] = { + entity, + refreshDate: dateMap[tag.localTarget], + target: tag.localTarget, + tags: [tag] + } } } + return res.json(tagMap); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error } - return res.json(tagMap); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); -tagsAPI.delete('/:uuid', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardian = new Guardians(); - if (!req.params.uuid) { - return next(createError(422, 'Invalid uuid')); + @Delete('/:uuid') + @HttpCode(HttpStatus.OK) + async deleteTag(@Req() req, @Response() res): Promise { + try { + const guardian = new Guardians(); + if (!req.params.uuid) { + throw new HttpException('Invalid uuid', HttpStatus.UNPROCESSABLE_ENTITY) + } + const result = await guardian.deleteTag(req.params.uuid, req.user.did); + return res.json(result); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; + // return next(error); } - const result = await guardian.deleteTag(req.params.uuid, req.user.did); - res.json(result); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); -tagsAPI.post('/synchronization', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const { entity, target } = req.body; + @Post('/synchronization') + @HttpCode(HttpStatus.OK) + async synchronizationTags(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const { entity, target } = req.body; - if (!entity) { - return next(createError(422, 'Invalid entity')); - } + if (!entity) { + throw new HttpException('Invalid entity', HttpStatus.UNPROCESSABLE_ENTITY) + } - if (typeof target !== 'string') { - return next(createError(422, 'Invalid target')); - } + if (typeof target !== 'string') { + throw new HttpException('Invalid target', HttpStatus.UNPROCESSABLE_ENTITY) + } - const tags = await guardians.synchronizationTags(entity, target); + const tags = await guardians.synchronizationTags(entity, target); - const result = { - entity, - target, - tags, - refreshDate: (new Date()).toISOString(), + const result = { + entity, + target, + tags, + refreshDate: (new Date()).toISOString(), + } + return res.json(result); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error } - return res.json(result); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); - -tagsAPI.get('/schemas', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const owner = user.did; - let pageIndex: any; - let pageSize: any; - if (req.query && req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; + + @Get('/schemas') + @HttpCode(HttpStatus.OK) + async getSchemas(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const owner = user.did; + let pageIndex: any; + let pageSize: any; + if (req.query && req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; + } + const { items, count } = await guardians.getTagSchemas(owner, pageIndex, pageSize); + items.forEach((s) => { s.readonly = s.readonly || s.owner !== owner }); + return res + .setHeader('X-Total-Count', count) + .json(SchemaUtils.toOld(items)); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; } - const { items, count } = await guardians.getTagSchemas(owner, pageIndex, pageSize); - items.forEach((s) => { s.readonly = s.readonly || s.owner !== owner }); - return res - .setHeader('X-Total-Count', count) - .json(SchemaUtils.toOld(items)); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); -tagsAPI.post('/schemas', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const newSchema = req.body; + @Post('/schemas') + @HttpCode(HttpStatus.CREATED) + async postSchemas(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; - if (!newSchema) { - return next(createError(422, 'Schema does not exist.')); - } + if (!newSchema) { + throw new HttpException('Schema does not exist.', HttpStatus.UNPROCESSABLE_ENTITY) + } - const guardians = new Guardians(); - const owner = user.did; + const guardians = new Guardians(); + const owner = user.did; - SchemaUtils.fromOld(newSchema); - delete newSchema.version; - delete newSchema.id; - delete newSchema._id; - delete newSchema.status; - delete newSchema.topicId; + SchemaUtils.fromOld(newSchema); + delete newSchema.version; + delete newSchema.id; + delete newSchema._id; + delete newSchema.status; + delete newSchema.topicId; - SchemaHelper.updateOwner(newSchema, owner); - const schema = await guardians.createTagSchema(newSchema); + SchemaHelper.updateOwner(newSchema, owner); + const schema = await guardians.createTagSchema(newSchema); - res.status(201).json(SchemaUtils.toOld(schema)); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); + return res.status(201).json(SchemaUtils.toOld(schema)); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; + } } -}); - -tagsAPI.delete('/schemas/:schemaId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); - if (error) { - return next(createError(403, error)); + + @Delete('/schemas/:schemaId') + @HttpCode(HttpStatus.OK) + async deleteSchema(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); + if (error) { + throw new HttpException('error', HttpStatus.FORBIDDEN) + } + await guardians.deleteSchema(schemaId); + return res.json(true); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; } - await guardians.deleteSchema(schemaId); - return res.json(true); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); - -tagsAPI.put('/schemas/:schemaId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const newSchema = req.body; - const owner = user.did; - const guardians = new Guardians(); - const schema = await guardians.getSchemaById(newSchema.id); - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); - if (error) { - return next(createError(403, error)); + + @Put('/schemas/:schemaId') + @HttpCode(HttpStatus.OK) + async setTag(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const newSchema = req.body; + const owner = user.did; + const guardians = new Guardians(); + const schema = await guardians.getSchemaById(newSchema.id); + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); + if (error) { + throw new HttpException('error', HttpStatus.FORBIDDEN) + } + SchemaUtils.fromOld(newSchema); + SchemaHelper.checkSchemaKey(newSchema); + SchemaHelper.updateOwner(newSchema, owner); + await guardians.updateSchema(newSchema); + return res.json(newSchema); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + // return next(error); + throw error; } - SchemaUtils.fromOld(newSchema); - SchemaHelper.checkSchemaKey(newSchema); - SchemaHelper.updateOwner(newSchema, owner); - await guardians.updateSchema(newSchema); - return res.json(newSchema); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); - -tagsAPI.put('/schemas/:schemaId/publish', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - const schemaId = req.params.schemaId; - const schema = await guardians.getSchemaById(schemaId); - const version = '1.0.0'; - const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); - if (error) { - return next(createError(403, error)); + + @Put('/schemas/:schemaId/publish') + @HttpCode(HttpStatus.OK) + async publishTag(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const user = req.user; + const guardians = new Guardians(); + const schemaId = req.params.schemaId; + const schema = await guardians.getSchemaById(schemaId); + const version = '1.0.0'; + const error = SchemaUtils.checkPermission(schema, user, SchemaCategory.TAG); + if (error) { + throw new HttpException('error', HttpStatus.FORBIDDEN) + } + const result = await guardians.publishTagSchema(schemaId, version, user.did); + return res.json(result); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; } - const result = await guardians.publishTagSchema(schemaId, version, user.did); - return res.json(result); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); - -tagsAPI.get('/schemas/published', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const schemas = await guardians.getPublishedTagSchemas(); - return res.send(schemas); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); + + @Get('/schemas/published') + @HttpCode(HttpStatus.OK) + async getPublished(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const schemas = await guardians.getPublishedTagSchemas(); + return res.send(schemas); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; + } } -}); +} diff --git a/api-gateway/src/api/service/task.ts b/api-gateway/src/api/service/task.ts index c5f9682688..2a570f61b7 100644 --- a/api-gateway/src/api/service/task.ts +++ b/api-gateway/src/api/service/task.ts @@ -1,17 +1,20 @@ -import { Response, Router, NextFunction } from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { TaskManager } from '@helpers/task-manager'; +import { Controller, Get, HttpCode, HttpStatus, Req, Response } from '@nestjs/common'; -export const taskAPI = Router(); - -taskAPI.get('/:taskId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - try { - const taskId = req.params.taskId; - const taskState = taskManager.getState(taskId); - return res.json(taskState); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); +@Controller('tasks') +export class TaskApi { + @Get('/:taskId') + @HttpCode(HttpStatus.OK) + async getTask(@Req() req, @Response() res): Promise { + const taskManager = new TaskManager(); + try { + const taskId = req.params.taskId; + const taskState = taskManager.getState(taskId); + return res.json(taskState); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); +} diff --git a/api-gateway/src/api/service/themes.ts b/api-gateway/src/api/service/themes.ts index b8b77d2754..9cb5173d3f 100644 --- a/api-gateway/src/api/service/themes.ts +++ b/api-gateway/src/api/service/themes.ts @@ -1,111 +1,102 @@ -import { Response, Router, NextFunction } from 'express'; -import { AuthenticatedRequest, Logger } from '@guardian/common'; +import { Logger } from '@guardian/common'; import { Guardians } from '@helpers/guardians'; -import createError from 'http-errors'; +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, Req, Response } from '@nestjs/common'; -/** - * Theme route - */ -export const themesAPI = Router(); - -/** - * Create Theme - */ -themesAPI.post('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const item = await guardians.createTheme(req.body, req.user.did); - return res.status(201).json(item); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); +@Controller('themes') +export class ThemesApi { + @Post('/') + @HttpCode(HttpStatus.CREATED) + async setThemes(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + const item = await guardians.createTheme(req.body, req.user.did); + return res.status(201).json(item); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; + } } -}); -/** - * Update Theme - */ -themesAPI.put('/:themeId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const newTheme = req.body; - const guardians = new Guardians(); - if (!req.params.themeId) { - return next(createError(422, 'Invalid theme id')); - } - const oldTheme = await guardians.getThemeById(req.params.themeId); - if (!oldTheme) { - return next(createError(404, 'Theme not found.')); + @Put('/:themeId') + @HttpCode(HttpStatus.OK) + async updateTheme(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const newTheme = req.body; + const guardians = new Guardians(); + if (!req.params.themeId) { + throw new HttpException('Invalid theme id', HttpStatus.UNPROCESSABLE_ENTITY) + } + const oldTheme = await guardians.getThemeById(req.params.themeId); + if (!oldTheme) { + throw new HttpException('Theme not found.', HttpStatus.NOT_FOUND) + } + const theme = await guardians.updateTheme(req.params.themeId, newTheme, user.did); + return res.json(theme); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const theme = await guardians.updateTheme(req.params.themeId, newTheme, user.did); - return res.json(theme); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -/** - * Delete Theme - */ -themesAPI.delete('/:themeId', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - if (!req.params.themeId) { - return next(createError(422, 'Invalid theme id')); + @Delete('/:themeId') + @HttpCode(HttpStatus.OK) + async deleteTheme(@Req() req, @Response() res): Promise { + try { + const guardians = new Guardians(); + if (!req.params.themeId) { + throw new HttpException('Invalid theme id', HttpStatus.UNPROCESSABLE_ENTITY) + } + const result = await guardians.deleteTheme(req.params.themeId, req.user.did); + return res.json(result); + } catch (error) { + await (new Logger()).error(error, ['API_GATEWAY']); + throw error; } - const result = await guardians.deleteTheme(req.params.themeId, req.user.did); - return res.json(result); - } catch (error) { - await (new Logger()).error(error, ['API_GATEWAY']); - return next(error); } -}); -/** - * Get Themes - */ -themesAPI.get('/', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const user = req.user; - const guardians = new Guardians(); - if (user.did) { - const themes = await guardians.getThemes(user.did); - return res.send(themes); + @Get('/') + @HttpCode(HttpStatus.OK) + async getThemes(@Req() req, @Response() res): Promise { + try { + const user = req.user; + const guardians = new Guardians(); + if (user.did) { + const themes = await guardians.getThemes(user.did); + return res.send(themes); + } + return res.send([]); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error } - return res.send([]); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -/** - * Import Theme - */ -themesAPI.post('/import/file', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const theme = await guardian.importThemeFile(req.body, req.user.did); - return res.status(201).send(theme); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Post('/import/file') + @HttpCode(HttpStatus.CREATED) + async importTheme(@Req() req, @Response() res): Promise { + const guardian = new Guardians(); + try { + const theme = await guardian.importThemeFile(req.body, req.user.did); + return res.status(201).send(theme); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); -/** - * Export Theme - */ -themesAPI.get('/:themeId/export/file', async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const guardian = new Guardians(); - try { - const file: any = await guardian.exportThemeFile(req.params.themeId, req.user.did); - res.setHeader('Content-disposition', `attachment; filename=theme_${Date.now()}`); - res.setHeader('Content-type', 'application/zip'); - return res.send(file); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + @Get('/:themeId/export/file') + @HttpCode(HttpStatus.OK) + async exportTheme(@Req() req, @Response() res): Promise { + const guardian = new Guardians(); + try { + const file: any = await guardian.exportThemeFile(req.params.themeId, req.user.did); + res.setHeader('Content-disposition', `attachment; filename=theme_${Date.now()}`); + res.setHeader('Content-type', 'application/zip'); + return res.send(file); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } } -}); \ No newline at end of file +} diff --git a/api-gateway/src/api/service/tokens.ts b/api-gateway/src/api/service/tokens.ts index ccf20a0cda..0cc7bb9912 100644 --- a/api-gateway/src/api/service/tokens.ts +++ b/api-gateway/src/api/service/tokens.ts @@ -1,18 +1,17 @@ import { Guardians } from '@helpers/guardians'; -import { permissionHelper } from '@auth/authorization-helper'; -import { Response, Router, NextFunction } from 'express'; import { IToken, ITokenInfo, UserRole } from '@guardian/interfaces'; -import { AuthenticatedRequest, Logger, RunFunctionAsync } from '@guardian/common'; +import { Logger, RunFunctionAsync } from '@guardian/common'; import { PolicyEngine } from '@helpers/policy-engine'; import { TaskManager } from '@helpers/task-manager'; import { ServiceError } from '@helpers/service-requests-base'; -import createError from 'http-errors'; import { prepareValidationResponse } from '@middlewares/validation'; +import { Controller, Delete, Get, HttpCode, HttpException, HttpStatus, Post, Put, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; /** * Token route */ -export const tokenAPI = Router(); +// export const tokenAPI = Router(); /** * Connect policies to tokens @@ -69,536 +68,625 @@ async function setDynamicTokenPolicy(tokens: any[], engineService?: PolicyEngine return tokens; } -tokenAPI.get('/', permissionHelper(UserRole.STANDARD_REGISTRY, UserRole.USER), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const engineService = new PolicyEngine(); +@Controller('tokens') +export class TokensApi { + @Get('/') + @HttpCode(HttpStatus.OK) + async getTokens(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY, UserRole.USER)(req.user); + try { + const guardians = new Guardians(); + const engineService = new PolicyEngine(); + + const user = req.user; + const policyId = req.query?.policy; + + let tokens: IToken[] = []; + if (user.role === UserRole.STANDARD_REGISTRY) { + tokens = await guardians.getTokens({ did: user.did }); + const map = await engineService.getTokensMap(user.did); + tokens = await setDynamicTokenPolicy(tokens, engineService); + tokens = setTokensPolicies(tokens, map, policyId, false); + } else if (user.did) { + tokens = await guardians.getAssociatedTokens(user.did); + const map = await engineService.getTokensMap(user.parent, 'PUBLISH'); + tokens = await setDynamicTokenPolicy(tokens, engineService); + tokens = setTokensPolicies(tokens, map, policyId, true); + } + return res.json(tokens); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } - const user = req.user; - const policyId = req.query?.policy; + @Post('/') + @HttpCode(HttpStatus.CREATED) + async newToken(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const engineService = new PolicyEngine(); + const user = req.user; + + if (!user.did) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + + let tokens = await guardians.setToken({ + token: req.body, + owner: user.did + }); - let tokens: IToken[] = []; - if (user.role === UserRole.STANDARD_REGISTRY) { tokens = await guardians.getTokens({ did: user.did }); const map = await engineService.getTokensMap(user.did); - tokens = await setDynamicTokenPolicy(tokens, engineService); - tokens = setTokensPolicies(tokens, map, policyId, false); - } else if (user.did) { - tokens = await guardians.getAssociatedTokens(user.did); - const map = await engineService.getTokensMap(user.parent, 'PUBLISH'); - tokens = await setDynamicTokenPolicy(tokens, engineService); - tokens = setTokensPolicies(tokens, map, policyId, true); + tokens = setTokensPolicies(tokens, map); + + return res.status(201).json(tokens); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - return res.json(tokens); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -tokenAPI.post('/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const engineService = new PolicyEngine(); + @Post('/push') + @HttpCode(HttpStatus.ACCEPTED) + async pushTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create token'); const user = req.user; - if (!user.did) { return res.status(422).json(prepareValidationResponse('User not registered')); } - let tokens = (await guardians.setToken({ - token: req.body, - owner: user.did - })); - - tokens = await guardians.getTokens({ did: user.did }); - const map = await engineService.getTokensMap(user.did); - tokens = setTokensPolicies(tokens, map); + const token = req.body; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.setTokenAsync(token, user.did, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - return res.status(201).json(tokens); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); - -tokenAPI.post('/push/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Create token'); - const user = req.user; - if (!user.did) { - return res.status(422).json(prepareValidationResponse('User not registered')); + return res.status(202).send({ taskId, expectation }); } - const token = req.body; - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.setTokenAsync(token, user.did, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); + @Put('/push') + @HttpCode(HttpStatus.ACCEPTED) + async updateTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Update token'); - res.status(202).send({ taskId, expectation }); -}); + const user = req.user; + const token = req.body; -tokenAPI.put('/push/', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Update token'); + if (!user.did) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } - const user = req.user; - const token = req.body; + if (!token.tokenId) { + return res.status(422).json(prepareValidationResponse('The field tokenId is required')); + } - if (!user.did) { - return res.status(422).json(prepareValidationResponse('User not registered')); - } + const guardians = new Guardians(); + const tokenObject = await guardians.getTokenById(token.tokenId); - if (!token.tokenId) { - return res.status(422).json(prepareValidationResponse('The field tokenId is required')); - } + if (!tokenObject) { + throw new HttpException('Token not found', HttpStatus.NOT_FOUND) + } - const guardians = new Guardians(); - const tokenObject = await guardians.getTokenById(token.tokenId); + if (tokenObject.owner !== user.did) { + throw new HttpException('Invalid creator.', HttpStatus.FORBIDDEN) + } - if (!tokenObject) { - return next(createError(404, 'Token not found')); - } + RunFunctionAsync(async () => { + await guardians.updateTokenAsync(token, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - if (tokenObject.owner !== user.did) { - return next(createError(403, 'Invalid creator.')); + return res.status(202).send({ taskId, expectation }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } - RunFunctionAsync(async () => { - await guardians.updateTokenAsync(token, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); + @Delete('/push/:tokenId') + @HttpCode(HttpStatus.ACCEPTED) + async deleteTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Update token'); - return res.status(202).send({ taskId, expectation }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); - } -}); + const user = req.user; + const tokenId = req.params.tokenId; -tokenAPI.delete('/push/:tokenId', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Update token'); + if (!user.did) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } - const user = req.user; - const tokenId = req.params.tokenId; + const guardians = new Guardians(); + const tokenObject = await guardians.getTokenById(tokenId); - if (!user.did) { - return res.status(422).json(prepareValidationResponse('User not registered')); - } + if (!tokenObject) { + throw new HttpException('Token does not exist.', HttpStatus.NOT_FOUND) + } - const guardians = new Guardians(); - const tokenObject = await guardians.getTokenById(tokenId); + if (tokenObject.owner !== user.did) { + throw new HttpException('Invalid creator.', HttpStatus.FORBIDDEN); + } - if (!tokenObject) { - return next(createError(404, 'Token does not exist.')); - } + RunFunctionAsync(async () => { + await guardians.deleteTokenAsync(tokenId, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - if (tokenObject.owner !== user.did) { - return next(createError(403, 'Invalid creator.')); + return res.status(202).send({ taskId, expectation }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } + } - RunFunctionAsync(async () => { - await guardians.deleteTokenAsync(tokenId, taskId); - }, async (error) => { + @Put('/:tokenId/associate') + @HttpCode(HttpStatus.OK) + async associateToken(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.USER)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const status = await guardians.associateToken(tokenId, userDid); + return res.json(status); + } catch (error) { new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - return res.status(202).send({ taskId, expectation }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not found', HttpStatus.NOT_FOUND) + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token does not exist.', HttpStatus.NOT_FOUND) + } + throw error; + } } -}); -tokenAPI.put('/:tokenId/associate', permissionHelper(UserRole.USER), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Put('/push/:tokenId/associate') + @HttpCode(HttpStatus.ACCEPTED) + async associateTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.USER)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Associate/dissociate token'); + const tokenId = req.params.tokenId; const userDid = req.user.did; if (!userDid) { return res.status(422).json(prepareValidationResponse('User not registered')); } - const status = await guardians.associateToken(tokenId, userDid); - return res.json(status); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); - } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); - } - return next(error); - } -}); -tokenAPI.put('/push/:tokenId/associate', permissionHelper(UserRole.USER), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Associate/dissociate token'); + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.associateTokenAsync(tokenId, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - const tokenId = req.params.tokenId; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); + return res.status(202).send({ taskId, expectation }); } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.associateTokenAsync(tokenId, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); + @Put('/:tokenId/dissociate') + @HttpCode(HttpStatus.OK) + async dissociateToken(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.USER)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const status = await guardians.dissociateToken(tokenId, userDid); + return res.json(status); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not found', HttpStatus.NOT_FOUND) + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token does not exist.', HttpStatus.NOT_FOUND) + } + throw error; + } + } - return res.status(202).send({ taskId, expectation }); -}); + @Put('/push/:tokenId/dissociate') + @HttpCode(HttpStatus.ACCEPTED) + async dissociateTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.USER)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Associate/dissociate token'); -tokenAPI.put('/:tokenId/dissociate', permissionHelper(UserRole.USER), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); const tokenId = req.params.tokenId; const userDid = req.user.did; if (!userDid) { return res.status(422).json(prepareValidationResponse('User not registered')); } - const status = await guardians.dissociateToken(tokenId, userDid); - return res.json(status); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); - } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.dissociateTokenAsync(tokenId, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); + } + + /** + * @deprecated + */ + @Put('/:tokenId/:username/grantKyc') + @HttpCode(HttpStatus.OK) + async grantKycOld(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const owner = req.user.did; + if (!owner) { + return res.status(500).json({ code: 500, message: 'User not registered' }); + return; + } + const result = await guardians.grantKycToken(tokenId, username, owner); + return res.status(200).json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + return res.status(500).json({ code: error.code || 500, message: error.message }); } - return next(error); } -}); -tokenAPI.put('/push/:tokenId/dissociate', permissionHelper(UserRole.USER), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Associate/dissociate token'); + /** + * @deprecated + */ + @Put('/:tokenId/:username/grantKyc') + @HttpCode(HttpStatus.OK) + async grantKycOld2(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const owner = req.user.did; + if (!owner) { + return res.status(500).json({ code: 500, message: 'User not registered' }); + } + const result = await guardians.grantKycToken(tokenId, username, owner); + res.status(200).json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + return res.status(500).json({ code: error.code || 500, message: error.message }); + } + } - const tokenId = req.params.tokenId; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); + @Put('/:tokenId/:username/grant-kyc') + @HttpCode(HttpStatus.OK) + async grantKyc(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + return res.json(await guardians.grantKycToken(tokenId, username, userDid)); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not found', HttpStatus.NOT_FOUND) + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token not found', HttpStatus.NOT_FOUND) + } + throw error; + } } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.dissociateTokenAsync(tokenId, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - return res.status(202).send({ taskId, expectation }); -}); + /** + * @deprecated + */ + @Put('/push/:tokenId/:username/grantKyc') + @HttpCode(HttpStatus.OK) + async grantKycAsyncOld(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Grant KYC'); -/** - * @deprecated - */ -tokenAPI.put('/:tokenId/:username/grantKyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - try { - const guardians = new Guardians(); const tokenId = req.params.tokenId; const username = req.params.username; const owner = req.user.did; if (!owner) { - res.status(500).json({ code: 500, message: 'User not registered' }); + return res.status(500).json({ code: 500, message: 'User not registered' }); return; } - const result = await guardians.grantKycToken(tokenId, username, owner); - res.status(200).json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).json({ code: error.code || 500, message: error.message }); + + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.grantKycTokenAsync(tokenId, username, owner, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); + + return res.status(200).send({ taskId, expectation }); } -}); -tokenAPI.put('/:tokenId/:username/grant-kyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Put('/push/:tokenId/:username/grant-kyc') + @HttpCode(HttpStatus.ACCEPTED) + async grantKycAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Grant KYC'); + const tokenId = req.params.tokenId; const username = req.params.username; const userDid = req.user.did; if (!userDid) { return res.status(422).json(prepareValidationResponse('User not registered')); } - return res.json(await guardians.grantKycToken(tokenId, username, userDid)); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); - } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); - } - return next(error); - } -}); -/** - * @deprecated - */ -tokenAPI.put('/push/:tokenId/:username/grantKyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Grant KYC'); - - const tokenId = req.params.tokenId; - const username = req.params.username; - const owner = req.user.did; - if (!owner) { - res.status(500).json({ code: 500, message: 'User not registered' }); - return; + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.grantKycTokenAsync(tokenId, username, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.grantKycTokenAsync(tokenId, username, owner, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - res.status(200).send({ taskId, expectation }); -}); - -tokenAPI.put('/push/:tokenId/:username/grant-kyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Grant KYC'); - - const tokenId = req.params.tokenId; - const username = req.params.username; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); + /** + * @deprecated + */ + @Put('/:tokenId/:username/revokeKyc') + @HttpCode(HttpStatus.OK) + async revokeKycOld(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const owner = req.user.did; + if (!owner) { + return res.status(500).json({ code: 500, message: 'User not registered' }); + return; + } + const result = await guardians.revokeKycToken(tokenId, username, owner); + res.status(200).json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + return res.status(500).json({ code: error.code || 500, message: error.message }); + } } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.grantKycTokenAsync(tokenId, username, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); + @Put('/:tokenId/:username/revoke-kyc') + @HttpCode(HttpStatus.OK) + async revokeKyc(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const result = await guardians.revokeKycToken(tokenId, username, userDid); + return res.json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not found', HttpStatus.NOT_FOUND) + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token not found', HttpStatus.NOT_FOUND) + } + throw error; + } + } - return res.status(202).send({ taskId, expectation }); -}); + /** + * @deprecated + */ + @Put('/push/:tokenId/:username/revokeKyc') + @HttpCode(HttpStatus.OK) + async revokeKycAsyncOld(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Revoke KYC'); -/** - * @deprecated - */ -tokenAPI.put('/:tokenId/:username/revokeKyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - try { - const guardians = new Guardians(); const tokenId = req.params.tokenId; const username = req.params.username; const owner = req.user.did; if (!owner) { - res.status(500).json({ code: 500, message: 'User not registered' }); - return; + return res.status(500).json({ code: 500, message: 'User not registered' }); } - const result = await guardians.revokeKycToken(tokenId, username, owner); - res.status(200).json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).json({ code: error.code || 500, message: error.message }); + + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.revokeKycTokenAsync(tokenId, username, owner, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); + + return res.status(200).send({ taskId, expectation }); } -}); -tokenAPI.put('/:tokenId/:username/revoke-kyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Put('/push/:tokenId/:username/revoke-kyc') + @HttpCode(HttpStatus.ACCEPTED) + async revokeKycAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Revoke KYC'); + const tokenId = req.params.tokenId; const username = req.params.username; const userDid = req.user.did; if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); - } - const result = await guardians.revokeKycToken(tokenId, username, userDid); - return res.json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); + throw new HttpException('User not registered', HttpStatus.UNPROCESSABLE_ENTITY); } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); - } - return next(error); - } -}); -/** - * @deprecated - */ -tokenAPI.put('/push/:tokenId/:username/revokeKyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Revoke KYC'); - - const tokenId = req.params.tokenId; - const username = req.params.username; - const owner = req.user.did; - if (!owner) { - res.status(500).json({ code: 500, message: 'User not registered' }); - return; - } + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.revokeKycTokenAsync(tokenId, username, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.revokeKycTokenAsync(tokenId, username, owner, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - res.status(200).send({ taskId, expectation }); -}); - -tokenAPI.put('/push/:tokenId/:username/revoke-kyc', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Revoke KYC'); - - const tokenId = req.params.tokenId; - const username = req.params.username; - const userDid = req.user.did; - if (!userDid) { - return next(createError(422, 'User not registered')); + return res.status(202).send({ taskId, expectation }); } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.revokeKycTokenAsync(tokenId, username, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - return res.status(202).send({ taskId, expectation }); -}); - -tokenAPI.put('/:tokenId/:username/freeze', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const tokenId = req.params.tokenId; - const username = req.params.username; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); - } - const result = await guardians.freezeToken(tokenId, username, userDid); - return res.json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); + @Put('/:tokenId/:username/freeze') + @HttpCode(HttpStatus.OK) + async freezeToken(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const result = await guardians.freezeToken(tokenId, username, userDid); + return res.json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not registered', HttpStatus.NOT_FOUND); + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token not registered', HttpStatus.NOT_FOUND); + } + throw error } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); + } + + @Put('/:tokenId/:username/unfreeze') + @HttpCode(HttpStatus.OK) + async unfreezeToken(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const result = await guardians.unfreezeToken(tokenId, username, userDid); + return res.json(result); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not registered', HttpStatus.NOT_FOUND); + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token not registered', HttpStatus.NOT_FOUND); + } + throw error; } - return next(error); } -}); -tokenAPI.put('/:tokenId/:username/unfreeze', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); + @Put('/push/:tokenId/:username/freeze') + @HttpCode(HttpStatus.ACCEPTED) + async freezeTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Freeze Token'); + const tokenId = req.params.tokenId; const username = req.params.username; const userDid = req.user.did; if (!userDid) { return res.status(422).json(prepareValidationResponse('User not registered')); } - const result = await guardians.unfreezeToken(tokenId, username, userDid); - return res.json(result); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); - } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); - } - return next(error); - } -}); -tokenAPI.put('/push/:tokenId/:username/freeze', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Freeze Token'); + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.freezeTokenAsync(tokenId, username, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); - const tokenId = req.params.tokenId; - const username = req.params.username; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); + return res.status(202).send({ taskId, expectation }); } - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.freezeTokenAsync(tokenId, username, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - return res.status(202).send({ taskId, expectation }); -}); - -tokenAPI.put('/push/:tokenId/:username/unfreeze', permissionHelper(UserRole.STANDARD_REGISTRY), async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const taskManager = new TaskManager(); - const { taskId, expectation } = taskManager.start('Unfreeze Token'); - - const tokenId = req.params.tokenId; - const username = req.params.username; - const userDid = req.user.did; - if (!userDid) { - return res.status(422).json(prepareValidationResponse('User not registered')); - } + @Put('/push/:tokenId/:username/unfreeze') + @HttpCode(HttpStatus.ACCEPTED) + async unfreezeTokenAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Freeze Token'); - RunFunctionAsync(async () => { - const guardians = new Guardians(); - await guardians.unfreezeTokenAsync(tokenId, username, userDid, taskId); - }, async (error) => { - new Logger().error(error, ['API_GATEWAY']); - taskManager.addError(taskId, { code: error.code || 500, message: error.message }); - }); - - return res.status(202).send({ taskId, expectation }); -}); - -tokenAPI.get('/:tokenId/:username/info', permissionHelper(UserRole.STANDARD_REGISTRY), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); const tokenId = req.params.tokenId; const username = req.params.username; const userDid = req.user.did; if (!userDid) { return res.status(422).json(prepareValidationResponse('User not registered')); } - const result = await guardians.getInfoToken(tokenId, username, userDid); - return res.json(result as ITokenInfo); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - if (error?.message?.toLowerCase().includes('user not found')) { - return next(createError(404, 'User not found')); - } - if (error?.message?.toLowerCase().includes('token not found')) { - return next(createError(404, 'Token not found')); + + RunFunctionAsync(async () => { + const guardians = new Guardians(); + await guardians.freezeTokenAsync(tokenId, username, userDid, taskId); + }, async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { code: error.code || 500, message: error.message }); + }); + + return res.status(202).send({ taskId, expectation }); + } + + @Get('/:tokenId/:username/info') + @HttpCode(HttpStatus.OK) + async getTokenInfo(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const guardians = new Guardians(); + const tokenId = req.params.tokenId; + const username = req.params.username; + const userDid = req.user.did; + if (!userDid) { + return res.status(422).json(prepareValidationResponse('User not registered')); + } + const result = await guardians.getInfoToken(tokenId, username, userDid); + return res.json(result as ITokenInfo); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + if (error?.message?.toLowerCase().includes('user not found')) { + throw new HttpException('User not registered', HttpStatus.NOT_FOUND); + } + if (error?.message?.toLowerCase().includes('token not found')) { + throw new HttpException('Token not registered', HttpStatus.NOT_FOUND); + } + throw error; } - return next(error); } -}); +} diff --git a/api-gateway/src/api/service/trust-chains.ts b/api-gateway/src/api/service/trust-chains.ts index 86d9e8fdc5..163495a761 100644 --- a/api-gateway/src/api/service/trust-chains.ts +++ b/api-gateway/src/api/service/trust-chains.ts @@ -1,78 +1,80 @@ import { Guardians } from '@helpers/guardians'; -import { Response, Router, NextFunction } from 'express'; -import { UserRole } from '@guardian/interfaces'; -import { permissionHelper } from '@auth/authorization-helper'; import { Users } from '@helpers/users'; -import { AuthenticatedRequest, IAuthUser, Logger } from '@guardian/common'; - -/** - * Audit route - */ -export const trustChainsAPI = Router(); +import { IAuthUser, Logger } from '@guardian/common'; +import { Controller, Get, HttpCode, HttpStatus, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; +import { UserRole } from '@guardian/interfaces'; -trustChainsAPI.get('/', permissionHelper(UserRole.AUDITOR), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - let pageIndex: any; - let pageSize: any; - let filters: any; - if (req.query) { - if (req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - if (req.query.policyId) { - filters = { - policyId: req.query.policyId +@Controller('trust-chains') +export class TrustChainsApi { + @Get('/') + @HttpCode(HttpStatus.OK) + async getTrustChains(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.AUDITOR)(req.user); + try { + const guardians = new Guardians(); + let pageIndex: any; + let pageSize: any; + let filters: any; + if (req.query) { + if (req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; } - } else if (req.query.policyOwner) { - filters = { - policyOwner: req.query.policyOwner + if (req.query.policyId) { + filters = { + policyId: req.query.policyId + } + } else if (req.query.policyOwner) { + filters = { + policyOwner: req.query.policyOwner + } } } + const { items, count } = await guardians.getVpDocuments({ + filters, + pageIndex, + pageSize + }); + return res.setHeader('X-Total-Count', count).json(items); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const { items, count } = await guardians.getVpDocuments({ - filters, - pageIndex, - pageSize - }); - return res.setHeader('X-Total-Count', count).json(items); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); } -}); -trustChainsAPI.get('/:hash', permissionHelper(UserRole.AUDITOR), - async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const guardians = new Guardians(); - const hash = req.params.hash; - const chain = await guardians.getChain(hash); - const DIDs = chain.map((item) => { - if (item.type === 'VC' && item.document) { - if (typeof item.document.issuer === 'string') { - return item.document.issuer; - } else { - return item.document.issuer.id; + @Get('/:hash') + @HttpCode(HttpStatus.OK) + async getTrustChainByHash(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.AUDITOR)(req.user); + try { + const guardians = new Guardians(); + const hash = req.params.hash; + const chain = await guardians.getChain(hash); + const DIDs = chain.map((item) => { + if (item.type === 'VC' && item.document) { + if (typeof item.document.issuer === 'string') { + return item.document.issuer; + } else { + return item.document.issuer.id; + } } - } - if (item.type === 'DID') { - return item.id; - } - return null; - }).filter(did => !!did); + if (item.type === 'DID') { + return item.id; + } + return null; + }).filter(did => !!did); - const users = new Users(); - const allUsers = (await users.getUsersByIds(DIDs)) || []; - const userMap = allUsers.map((user: IAuthUser) => { - return { username: user.username, did: user.did } - }) + const users = new Users(); + const allUsers = (await users.getUsersByIds(DIDs)) || []; + const userMap = allUsers.map((user: IAuthUser) => { + return { username: user.username, did: user.did } + }) - res.json({ chain, userMap }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - return next(error); + return res.json({ chain, userMap }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); +} diff --git a/api-gateway/src/api/service/trustchains.ts b/api-gateway/src/api/service/trustchains.ts index d5292bdc31..d5a7e8054b 100644 --- a/api-gateway/src/api/service/trustchains.ts +++ b/api-gateway/src/api/service/trustchains.ts @@ -1,82 +1,156 @@ import { Guardians } from '@helpers/guardians'; -import { Response, Router } from 'express'; import { UserRole } from '@guardian/interfaces'; -import { permissionHelper } from '@auth/authorization-helper'; +import { checkPermission } from '@auth/authorization-helper'; import { Users } from '@helpers/users'; -import { AuthenticatedRequest, IAuthUser, Logger } from '@guardian/common'; +import { IAuthUser, Logger } from '@guardian/common'; +import { Controller, Get, HttpCode, HttpStatus, Req, Response } from '@nestjs/common'; -/** - * Audit route - */ -export const trustchainsAPI = Router(); - -/** - * @deprecated - */ -trustchainsAPI.get('/', permissionHelper(UserRole.AUDITOR), async (req: AuthenticatedRequest, res: Response) => { - try { - const guardians = new Guardians(); - let pageIndex: any; - let pageSize: any; - let filters: any; - if (req.query) { - if (req.query.pageIndex && req.query.pageSize) { - pageIndex = req.query.pageIndex; - pageSize = req.query.pageSize; - } - if (req.query.policyId) { - filters = { - policyId: req.query.policyId +@Controller('trustchains') +export class TrustChainsOldApi { + @Get('/') + @HttpCode(HttpStatus.OK) + async getTrustChains(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.AUDITOR)(req.user); + try { + const guardians = new Guardians(); + let pageIndex: any; + let pageSize: any; + let filters: any; + if (req.query) { + if (req.query.pageIndex && req.query.pageSize) { + pageIndex = req.query.pageIndex; + pageSize = req.query.pageSize; } - } else if (req.query.policyOwner) { - filters = { - policyOwner: req.query.policyOwner + if (req.query.policyId) { + filters = { + policyId: req.query.policyId + } + } else if (req.query.policyOwner) { + filters = { + policyOwner: req.query.policyOwner + } } } + const { items, count } = await guardians.getVpDocuments({ + filters, + pageIndex, + pageSize + }); + return res.setHeader('X-Total-Count', count).json(items); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; } - const { items, count } = await guardians.getVpDocuments({ - filters, - pageIndex, - pageSize - }); - res.status(200).setHeader('X-Total-Count', count).json(items); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).json({ code: 500, message: error.message }); } -}); -/** - * @deprecated - */ -trustchainsAPI.get('/:hash', permissionHelper(UserRole.AUDITOR), async (req: AuthenticatedRequest, res: Response) => { - try { - const guardians = new Guardians(); - const hash = req.params.hash; - const chain = await guardians.getChain(hash); - const DIDs = chain.map((item) => { - if (item.type === 'VC' && item.document) { - if (typeof item.document.issuer === 'string') { - return item.document.issuer; - } else { - return item.document.issuer.id; + @Get('/:hash') + @HttpCode(HttpStatus.OK) + async getTrustChainByHash(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.AUDITOR)(req.user); + try { + const guardians = new Guardians(); + const hash = req.params.hash; + const chain = await guardians.getChain(hash); + const DIDs = chain.map((item) => { + if (item.type === 'VC' && item.document) { + if (typeof item.document.issuer === 'string') { + return item.document.issuer; + } else { + return item.document.issuer.id; + } } - } - if (item.type === 'DID') { - return item.id; - } - return null; - }).filter(did => !!did); + if (item.type === 'DID') { + return item.id; + } + return null; + }).filter(did => !!did); - const users = new Users(); - const allUsers = (await users.getUsersByIds(DIDs)) || []; - const userMap = allUsers.map((user: IAuthUser) => { - return { username: user.username, did: user.did } - }) + const users = new Users(); + const allUsers = (await users.getUsersByIds(DIDs)) || []; + const userMap = allUsers.map((user: IAuthUser) => { + return { username: user.username, did: user.did } + }) - res.status(200).json({ chain, userMap }); - } catch (error) { - new Logger().error(error, ['API_GATEWAY']); - res.status(500).json({ code: 500, message: error.message }); + return res.json({ chain, userMap }); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error + } } -}); +} + +// /** +// * Audit route +// */ +// export const trustchainsAPI = Router(); +// +// /** +// * @deprecated +// */ +// trustchainsAPI.get('/', permissionHelper(UserRole.AUDITOR), async (req: AuthenticatedRequest, res: Response) => { +// try { +// const guardians = new Guardians(); +// let pageIndex: any; +// let pageSize: any; +// let filters: any; +// if (req.query) { +// if (req.query.pageIndex && req.query.pageSize) { +// pageIndex = req.query.pageIndex; +// pageSize = req.query.pageSize; +// } +// if (req.query.policyId) { +// filters = { +// policyId: req.query.policyId +// } +// } else if (req.query.policyOwner) { +// filters = { +// policyOwner: req.query.policyOwner +// } +// } +// } +// const { items, count } = await guardians.getVpDocuments({ +// filters, +// pageIndex, +// pageSize +// }); +// res.status(200).setHeader('X-Total-Count', count).json(items); +// } catch (error) { +// new Logger().error(error, ['API_GATEWAY']); +// res.status(500).json({ code: 500, message: error.message }); +// } +// }); +// +// /** +// * @deprecated +// */ +// trustchainsAPI.get('/:hash', permissionHelper(UserRole.AUDITOR), async (req: AuthenticatedRequest, res: Response) => { +// try { +// const guardians = new Guardians(); +// const hash = req.params.hash; +// const chain = await guardians.getChain(hash); +// const DIDs = chain.map((item) => { +// if (item.type === 'VC' && item.document) { +// if (typeof item.document.issuer === 'string') { +// return item.document.issuer; +// } else { +// return item.document.issuer.id; +// } +// } +// if (item.type === 'DID') { +// return item.id; +// } +// return null; +// }).filter(did => !!did); +// +// const users = new Users(); +// const allUsers = (await users.getUsersByIds(DIDs)) || []; +// const userMap = allUsers.map((user: IAuthUser) => { +// return { username: user.username, did: user.did } +// }) +// +// res.status(200).json({ chain, userMap }); +// } catch (error) { +// new Logger().error(error, ['API_GATEWAY']); +// res.status(500).json({ code: 500, message: error.message }); +// } +// }); diff --git a/api-gateway/src/api/service/websockets.ts b/api-gateway/src/api/service/websockets.ts index 79b6f10dc0..a8fac831d1 100644 --- a/api-gateway/src/api/service/websockets.ts +++ b/api-gateway/src/api/service/websockets.ts @@ -1,19 +1,10 @@ import WebSocket from 'ws'; import { IncomingMessage, Server } from 'http'; import { Users } from '@helpers/users'; -import { - MessageAPI, - IStatus, - ApplicationStates, GenerateUUIDv4 -} from '@guardian/interfaces'; -import { - MessageResponse, - Logger, - NatsService, - Singleton -} from '@guardian/common'; +import { ApplicationStates, GenerateUUIDv4, IStatus, MessageAPI } from '@guardian/interfaces'; +import { Logger, MessageResponse, NatsService, Singleton } from '@guardian/common'; import { NatsConnection } from 'nats'; -// import { Guardians } from '@helpers/guardians'; +import { Injectable } from '@nestjs/common'; /** * WebSocketsServiceChannel @@ -44,7 +35,7 @@ export class WebSocketsServiceChannel extends NatsService { /** * WebSocket service class */ -@Singleton +@Injectable() export class WebSocketsService { /** * Channel @@ -113,7 +104,7 @@ export class WebSocketsService { if (this.checkUserByDid(client, msg)) { this.send(client, { type: 'update-event', - data: msg.uuid + data: msg.blocks }); } }); diff --git a/api-gateway/src/api/service/wizard.ts b/api-gateway/src/api/service/wizard.ts new file mode 100644 index 0000000000..8942035c35 --- /dev/null +++ b/api-gateway/src/api/service/wizard.ts @@ -0,0 +1,77 @@ +import { Guardians } from '@helpers/guardians'; +import { Logger, RunFunctionAsync, } from '@guardian/common'; +import { TaskManager } from '@helpers/task-manager'; +import { ServiceError } from '@helpers/service-requests-base'; +import { Controller, HttpCode, HttpStatus, Post, Req, Response } from '@nestjs/common'; +import { checkPermission } from '@auth/authorization-helper'; +import { UserRole } from '@guardian/interfaces'; + +@Controller('wizard') +export class WizardApi { + @Post('/policy') + @HttpCode(HttpStatus.CREATED) + async setPolicy(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const wizardConfig = req.body; + const user = req.user; + const guardians = new Guardians(); + return res.status(201).json( + await guardians.wizardPolicyCreate(wizardConfig, user.did) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } + + @Post('/policy/push') + @HttpCode(HttpStatus.ACCEPTED) + async setPolicyAsync(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + const taskManager = new TaskManager(); + const { taskId, expectation } = taskManager.start('Create policy'); + const wizardConfig = req.body; + const user = req.user; + RunFunctionAsync( + async () => { + const guardians = new Guardians(); + await guardians.wizardPolicyCreateAsync( + wizardConfig, + user.did, + taskId + ); + }, + async (error) => { + new Logger().error(error, ['API_GATEWAY']); + taskManager.addError(taskId, { + code: 500, + message: error.message, + }); + } + ); + return res.status(202).send({ taskId, expectation }); + } + + @Post('/:policyId/config') + @HttpCode(HttpStatus.OK) + async setPolicyConfig(@Req() req, @Response() res): Promise { + await checkPermission(UserRole.STANDARD_REGISTRY)(req.user); + try { + const wizardConfig = req.body; + const user = req.user; + const { policyId } = req.params; + const guardians = new Guardians(); + return res.json( + await guardians.wizardGetPolicyConfig( + policyId, + wizardConfig, + user.did + ) + ); + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + throw error; + } + } +} diff --git a/api-gateway/src/app.module.ts b/api-gateway/src/app.module.ts new file mode 100644 index 0000000000..7d55930733 --- /dev/null +++ b/api-gateway/src/app.module.ts @@ -0,0 +1,103 @@ +import { MiddlewareConsumer, Module } from '@nestjs/common'; +import { AccountApi } from '@api/service/account'; +import { AnalyticsApi } from '@api/service/analytics'; +import { ArtifactApi } from '@api/service/artifact'; +import { ContractsApi } from '@api/service/contract'; +import { DemoApi } from '@api/service/demo'; +import { ExternalApi } from '@api/service/external'; +import { IpfsApi } from '@api/service/ipfs'; +import { LoggerApi, LoggerService } from '@api/service/logger'; +import { MapApi } from '@api/service/map'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { MetricsApi } from '@api/service/metrics'; +import { ModulesApi } from '@api/service/module'; +import { ProfileApi } from '@api/service/profile'; +import { authorizationHelper } from '@auth/authorization-helper'; +import { PolicyApi } from '@api/service/policy'; +import { SchemaApi, SingleSchemaApi } from '@api/service/schema'; +import { SettingsApi } from '@api/service/settings'; +import { TagsApi } from '@api/service/tags'; +import { TaskApi } from '@api/service/task'; +import { TokensApi } from '@api/service/tokens'; +import { TrustChainsApi } from '@api/service/trust-chains'; +import { WizardApi } from '@api/service/wizard'; +import process from 'process'; +import express from 'express'; +import fileUpload from 'express-fileupload'; +import hpp from 'hpp'; +import { ThemesApi } from '@api/service/themes'; +import { TrustChainsOldApi } from '@api/service/trustchains'; + +const RAW_REQUEST_LIMIT = process.env.RAW_REQUEST_LIMIT || '1gb'; + +@Module({ + imports: [ + ClientsModule.register([{ + name: 'GUARDIANS', + transport: Transport.NATS, + options: { + name: `${process.env.SERVICE_CHANNEL}`, + servers: [ + `nats://${process.env.MQ_ADDRESS}:4222` + ] + } + }]), + ], + controllers: [ + AccountApi, + AnalyticsApi, + ArtifactApi, + ContractsApi, + DemoApi, + ExternalApi, + IpfsApi, + LoggerApi, + MapApi, + MetricsApi, + ModulesApi, + ProfileApi, + PolicyApi, + SingleSchemaApi, + SchemaApi, + SettingsApi, + TagsApi, + TaskApi, + TokensApi, + ThemesApi, + TrustChainsApi, + TrustChainsOldApi, + WizardApi + ], + providers: [ + LoggerService + ] +}) +export class AppModule { + configure(consumer: MiddlewareConsumer) { + consumer.apply(authorizationHelper).forRoutes(AccountApi); + consumer.apply(authorizationHelper).forRoutes(ProfileApi); + consumer.apply(authorizationHelper).forRoutes(PolicyApi); + consumer.apply(authorizationHelper).forRoutes(SettingsApi); + consumer.apply(authorizationHelper).forRoutes(SingleSchemaApi); + consumer.apply(authorizationHelper).forRoutes(SchemaApi); + consumer.apply(authorizationHelper).forRoutes(ArtifactApi); + consumer.apply(authorizationHelper).forRoutes(IpfsApi); + consumer.apply(authorizationHelper).forRoutes(LoggerApi); + consumer.apply(authorizationHelper).forRoutes(AnalyticsApi); + consumer.apply(authorizationHelper).forRoutes(ContractsApi); + consumer.apply(authorizationHelper).forRoutes(ModulesApi); + consumer.apply(authorizationHelper).forRoutes(TagsApi); + consumer.apply(authorizationHelper).forRoutes(ThemesApi); + consumer.apply(authorizationHelper).forRoutes(TokensApi); + consumer.apply(authorizationHelper).forRoutes(TrustChainsApi); + consumer.apply(authorizationHelper).forRoutes(WizardApi); + + consumer.apply(express.raw({ + inflate: true, + limit: RAW_REQUEST_LIMIT, + type: 'binary/octet-stream' + })).forRoutes('*'); + consumer.apply(fileUpload()).forRoutes('*'); + consumer.apply(hpp()).forRoutes('*'); + } +} diff --git a/api-gateway/src/app.ts b/api-gateway/src/app.ts index 9a2a79c7b2..1a74460044 100644 --- a/api-gateway/src/app.ts +++ b/api-gateway/src/app.ts @@ -1,61 +1,49 @@ -import hpp from 'hpp'; - -import { - accountAPI, - trustchainsAPI, - trustChainsAPI, - demoAPI, - profileAPI, - schemaAPI, - tokenAPI, - externalAPI, - ipfsAPI, - analyticsAPI, - moduleAPI, - tagsAPI, - themesAPI -} from '@api/service'; +// import client from 'prom-client'; import { Guardians } from '@helpers/guardians'; -import express from 'express'; -import { createServer } from 'http'; -import { authorizationHelper } from '@auth/authorization-helper'; import { IPFS } from '@helpers/ipfs'; -import { policyAPI } from '@api/service/policy'; import { PolicyEngine } from '@helpers/policy-engine'; import { WebSocketsService } from '@api/service/websockets'; import { Users } from '@helpers/users'; import { Wallet } from '@helpers/wallet'; -import { settingsAPI } from '@api/service/settings'; -import { loggerAPI } from '@api/service/logger'; -import { MessageBrokerChannel, Logger, LargePayloadContainer } from '@guardian/common'; -import { taskAPI } from '@api/service/task'; +import { LargePayloadContainer, Logger, MessageBrokerChannel } from '@guardian/common'; import { TaskManager } from '@helpers/task-manager'; -import { singleSchemaRoute } from '@api/service/schema'; -import { artifactAPI } from '@api/service/artifact'; -import fileupload from 'express-fileupload'; -import { contractAPI } from '@api/service/contract'; -import { mapAPI } from '@api/service/map'; +import { AppModule } from './app.module'; +import { NestFactory } from '@nestjs/core'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; +import process from 'process'; +import { HttpStatus, ValidationPipe } from '@nestjs/common'; const PORT = process.env.PORT || 3002; -const RAW_REQUEST_LIMIT = process.env.RAW_REQUEST_LIMIT || '1gb'; -const JSON_REQUEST_LIMIT = process.env.JSON_REQUEST_LIMIT || '1mb'; +// const RAW_REQUEST_LIMIT = process.env.RAW_REQUEST_LIMIT || '1gb'; +// const JSON_REQUEST_LIMIT = process.env.JSON_REQUEST_LIMIT || '1mb'; + +// const restResponseTimeHistogram = new client.Histogram({ +// name: 'api_gateway_rest_response_time_duration_seconds', +// help: 'api-gateway a histogram metric', +// labelNames: ['method', 'route', 'statusCode'], +// buckets: [0.1, 5, 15, 50, 100, 500], +// }); Promise.all([ + NestFactory.create(AppModule, { + rawBody: true + }), MessageBrokerChannel.connect('API_GATEWAY'), -]).then(async ([cn]) => { +]).then(async ([app, cn]) => { try { - const app = express(); - - app.use(express.json({ - limit: JSON_REQUEST_LIMIT - })); - app.use(express.raw({ - inflate: true, - limit: RAW_REQUEST_LIMIT, - type: 'binary/octet-stream' + app.connectMicroservice({ + transport: Transport.NATS, + options: { + name: `${process.env.SERVICE_CHANNEL}`, + servers: [ + `nats://${process.env.MQ_ADDRESS}:4222` + ] + }, + }); + app.useGlobalPipes(new ValidationPipe({ + errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY })); - app.use(fileupload()); - app.use(hpp()); + new Logger().setConnection(cn); await new Guardians().setConnection(cn).init(); await new IPFS().setConnection(cn).init(); @@ -63,54 +51,18 @@ Promise.all([ await new Users().setConnection(cn).init(); await new Wallet().setConnection(cn).init(); - const server = createServer(app); + const server = app.getHttpServer(); const wsService = new WebSocketsService(server, cn); wsService.init(); new TaskManager().setDependecies(wsService, cn); - //////////////////////////////////////// - - // Config routes - app.use('/policies', authorizationHelper, policyAPI); - app.use('/accounts', accountAPI); - app.use('/profiles', authorizationHelper, profileAPI); - app.use('/settings', authorizationHelper, settingsAPI); - app.use('/schema', authorizationHelper, singleSchemaRoute); - app.use('/schemas', authorizationHelper, schemaAPI); - app.use('/tokens', authorizationHelper, tokenAPI); - app.use('/artifacts', authorizationHelper, artifactAPI); - app.use('/trust-chains/', authorizationHelper, trustChainsAPI); - app.use('/external/', externalAPI); - app.use('/demo/', demoAPI); - app.use('/ipfs', authorizationHelper, ipfsAPI); - app.use('/logs', authorizationHelper, loggerAPI); - app.use('/tasks', taskAPI); - app.use('/analytics', authorizationHelper, analyticsAPI); - app.use('/contracts', authorizationHelper, contractAPI); - app.use('/modules', authorizationHelper, moduleAPI); - app.use('/tags', authorizationHelper, tagsAPI); - app.use('/map', mapAPI); - app.use('/themes', authorizationHelper, themesAPI); - - /** - * @deprecated 2023-03-01 - */ - app.use('/trustchains/', authorizationHelper, trustchainsAPI); - app.use('/artifact', authorizationHelper, artifactAPI); - ///////////////////////////////////////// - - // middleware error handler - app.use((err, req, res, next) => { - return res.status(err?.status || 500).json({ code: err?.status || 500, message: err.message }) - }); - - server.setTimeout(); const maxPayload = parseInt(process.env.MQ_MAX_PAYLOAD, 10); if (Number.isInteger(maxPayload)) { new LargePayloadContainer().runServer(); } - server.setTimeout(12000000).listen(PORT, () => { + app.listen(PORT, async () => { + console.log(await app.getUrl()); new Logger().info(`Started on ${PORT}`, ['API_GATEWAY']); }); } catch (error) { diff --git a/api-gateway/src/auth/authorization-helper.ts b/api-gateway/src/auth/authorization-helper.ts index c9adb9b0e4..2aa5488c37 100644 --- a/api-gateway/src/auth/authorization-helper.ts +++ b/api-gateway/src/auth/authorization-helper.ts @@ -1,6 +1,53 @@ -import { Response } from 'express'; +import { NextFunction, Response } from 'express'; import { Users } from '@helpers/users'; import { AuthenticatedRequest, IAuthUser, Logger } from '@guardian/common'; +import { HttpException, HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; + +/** + * Auth middleware + */ +@Injectable() +export class AuthMiddleware implements NestMiddleware { + + /** + * Use + * @param req + * @param res + * @param next + */ + async use(req: AuthenticatedRequest, res: Response, next: NextFunction) { + const authHeader = req.headers.authorization; + const users = new Users(); + if (authHeader) { + const token = authHeader.split(' ')[1]; + try { + req.user = await users.getUserByToken(token) as IAuthUser; + next(); + return; + } catch (error) { + new Logger().error(error, ['API_GATEWAY']); + } + } + res.sendStatus(401); + } +} + +/** + * Permission middleware + */ +@Injectable() +export class PermissionMiddleware implements NestMiddleware { + + /** + * Permission middleware + * @param req + * @param res + * @param next + */ + use(req: AuthenticatedRequest, res: Response, next: NextFunction) { + next(); + } +} /** * Authorization middleware @@ -10,6 +57,10 @@ import { AuthenticatedRequest, IAuthUser, Logger } from '@guardian/common'; */ export async function authorizationHelper(req: AuthenticatedRequest, res: Response, next: Function): Promise { const authHeader = req.headers.authorization; + if (!authHeader) { + next(); + return; + } const users = new Users(); if (authHeader) { const token = authHeader.split(' ')[1]; @@ -24,6 +75,25 @@ export async function authorizationHelper(req: AuthenticatedRequest, res: Respon res.sendStatus(401); } +/** + * Calculate user permissions + * @param roles + */ +export function checkPermission(...roles: string[]) { + return async (user: IAuthUser): Promise => { + if (user) { + if(user.role) { + if(roles.indexOf(user.role) !== -1) { + return; + } + } + throw new HttpException('Forbidden', HttpStatus.FORBIDDEN) + } else { + throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED) + } + } +} + /** * Calculate user permissions * @param roles diff --git a/api-gateway/src/config.ts b/api-gateway/src/config.ts index 09b42d9446..e1dad3e9bc 100644 --- a/api-gateway/src/config.ts +++ b/api-gateway/src/config.ts @@ -1,6 +1,7 @@ import moduleAlias from 'module-alias'; import dotenv from 'dotenv'; import 'reflect-metadata' +import fs from 'fs'; moduleAlias.addAliases({ '@api': __dirname + '/api', @@ -11,3 +12,24 @@ moduleAlias.addAliases({ }); dotenv.config(); + +const envPath = process.env.GUARDIAN_ENV ? `./configs/.env.gateway.${process.env.GUARDIAN_ENV}` : './configs/.env.gateway'; + +if (!process.env.OVERRIDE || process.env.OVERRIDE === 'false'){ + console.log('reading from', envPath, 'not overriding'); + dotenv.config({ path: envPath}); +}else{ + try { + const envConfig = dotenv.parse(fs.readFileSync(envPath)); + for (const k of Object.keys(envConfig)) { + process.env[k] = envConfig[k] + } + } catch (err) { + if (err.code === 'ENOENT') { + console.log('WARN: Specific environment not loaded'); + } else { + throw err; + } + } +} +// console.log('Charged Environment',process.env,'\r\n___ . ___'); diff --git a/api-gateway/src/helpers/guardians.ts b/api-gateway/src/helpers/guardians.ts index 4b9a88d218..44660dd5d3 100644 --- a/api-gateway/src/helpers/guardians.ts +++ b/api-gateway/src/helpers/guardians.ts @@ -457,7 +457,8 @@ export class Guardians extends NatsService { * @param username */ public async getBalance(username: string): Promise { - return await this.sendMessage(MessageAPI.GET_BALANCE, { username }); + const b = await this.sendMessage(MessageAPI.GET_BALANCE, { username }); + return b as string; } /** @@ -1507,4 +1508,45 @@ export class Guardians extends NatsService { const file = await this.sendMessage(MessageAPI.THEME_EXPORT_FILE, { themeId, owner }) as any; return Buffer.from(file, 'base64'); } + + /** + * Create policy by wizard + * @param config Config + * @returns Config + */ + // tslint:disable-next-line:completed-docs + public async wizardPolicyCreate(config: any, owner: string): Promise<{ wizardConfig: any; policyId: string; }> { + return await this.sendMessage(MessageAPI.WIZARD_POLICY_CREATE, { + owner, + config, + }); + } + + /** + * Create policy by wizard + * @param config Config + * @returns Config + */ + public async wizardPolicyCreateAsync(config: any, owner: string, taskId: string) { + return await this.sendMessage(MessageAPI.WIZARD_POLICY_CREATE_ASYNC, { + owner, + config, + taskId + }); + } + + /** + * Get new policy config + * @param policyId Policy Identifier + * @param config Config + * @returns Config + */ + // tslint:disable-next-line:completed-docs + public async wizardGetPolicyConfig(policyId: string, config: any, owner: string): Promise<{ wizardConfig: any; policyConfig: any; }> { + return await this.sendMessage(MessageAPI.WIZARD_GET_POLICY_CONFIG, { + policyId, + config, + owner, + }); + } } diff --git a/api-gateway/src/middlewares/validation/schemas/accounts.ts b/api-gateway/src/middlewares/validation/schemas/accounts.ts index 4378323851..62323cb5dc 100644 --- a/api-gateway/src/middlewares/validation/schemas/accounts.ts +++ b/api-gateway/src/middlewares/validation/schemas/accounts.ts @@ -1,5 +1,30 @@ import * as yup from 'yup'; import fieldsValidation from '../fields-validation' +import { IsNotEmpty } from 'class-validator'; +import { UserRole } from '@guardian/interfaces'; + +export class LoginUserDTO { + @IsNotEmpty() + username: string; + + @IsNotEmpty() + password: string; +} + +export class RegisterUserDTO { + @IsNotEmpty() + username: string; + + @IsNotEmpty() + password: string; + + @IsNotEmpty() + // tslint:disable-next-line:variable-name + password_confirmation: string; + + @IsNotEmpty() + role: UserRole | string +} export const registerSchema = () => { const { username, password, password_confirmation, role } = fieldsValidation diff --git a/api-tests/index.js b/api-tests/index.js index 43f92adb3e..240e0ea608 100644 --- a/api-tests/index.js +++ b/api-tests/index.js @@ -18,12 +18,12 @@ describe('Tests', async function () { before(async function () { this.timeout(10000000000); const pathArray = [ - [path.resolve(path.join('..', 'logger-service')), {}], - [path.resolve(path.join('..', 'worker-service')), {IPFS_STORAGE_API_KEY: process.env.IPFS_STORAGE_API_KEY}], - [path.resolve(path.join('..', 'auth-service')), {HASHICORP_ADDRESS: `http://${process.env.HASHICORP_HOST}:${process.env.HASHICORP_PORT}`}], - [path.resolve(path.join('..', 'policy-service')), {OPERATOR_ID: process.env.OPERATOR_ID, OPERATOR_KEY: process.env.OPERATOR_KEY}], - [path.resolve(path.join('..', 'guardian-service')), {OPERATOR_ID: process.env.OPERATOR_ID, OPERATOR_KEY: process.env.OPERATOR_KEY}], - [path.resolve(path.join('..', 'api-gateway')), {}] + [path.resolve(path.join('..', 'logger-service')), {GUARDIAN_ENV: 'develop'}], + [path.resolve(path.join('..', 'worker-service')), {IPFS_STORAGE_API_KEY: process.env.IPFS_STORAGE_API_KEY, GUARDIAN_ENV: 'develop'}], + [path.resolve(path.join('..', 'auth-service')), {HASHICORP_ADDRESS: `http://${process.env.HASHICORP_HOST}:${process.env.HASHICORP_PORT}`, GUARDIAN_ENV: 'develop'}], + [path.resolve(path.join('..', 'policy-service')), {OPERATOR_ID: process.env.OPERATOR_ID, OPERATOR_KEY: process.env.OPERATOR_KEY, GUARDIAN_ENV: 'develop'}], + [path.resolve(path.join('..', 'guardian-service')), {OPERATOR_ID: process.env.OPERATOR_ID, OPERATOR_KEY: process.env.OPERATOR_KEY, GUARDIAN_ENV: 'develop'}], + [path.resolve(path.join('..', 'api-gateway')), {GUARDIAN_ENV: 'develop'}] ]; for (let p of pathArray) { processes.push( diff --git a/api-tests/package.json b/api-tests/package.json index 27c53692fe..bff3990ff5 100644 --- a/api-tests/package.json +++ b/api-tests/package.json @@ -1,6 +1,6 @@ { "name": "api-tests", - "version": "2.12.2", + "version": "2.13.0-prerelease", "description": "API Tests", "main": "index.js", "scripts": { @@ -18,5 +18,6 @@ "dependencies": { "axios": "^1.3.6", "dotenv": "^16.0.1" - } + }, + "stableVersion": "2.12.0" } diff --git a/application-events/package.json b/application-events/package.json index 58ba5437b6..1d5215ca05 100644 --- a/application-events/package.json +++ b/application-events/package.json @@ -1,6 +1,6 @@ { "name": "application-events", - "version": "2.12.2", + "version": "1.0.0", "description": "", "main": "index.js", "scripts": { diff --git a/auth-service/.env b/auth-service/.env index 54e02489af..18face0ea2 100644 --- a/auth-service/.env +++ b/auth-service/.env @@ -1,18 +1 @@ -ENV="develop" -HEDERA_NET="testnet" -PREUSED_HEDERA_NET="testnet" -MQ_ADDRESS="localhost" -SERVICE_CHANNEL="auth-service" -ACCESS_TOKEN_SECRET="youraccesstokensecret" -DB_HOST="localhost" -DB_DATABASE="auth_db" -VAULT_PROVIDER="database" -HASHICORP_TOKEN="1234" -HASHICORP_ADDRESS="http://localhost:8200" -HASHICORP_NAMESPACE="admin" -HASHICORP_ENCRIPTION_ALG="sha512" -MQ_MAX_PAYLOAD="1048576" -#LOG_LEVEL="2" -#HASHICORP_USEAL_KEY="" -#IMPORT_KEYS_FROM_DB=1 -#MQ_MESSAGE_CHUNK=5000000 +GUARDIAN_ENV="" diff --git a/auth-service/.env.docker b/auth-service/.env.docker index 337b612d26..ef5c546786 100644 --- a/auth-service/.env.docker +++ b/auth-service/.env.docker @@ -1,17 +1,25 @@ -HEDERA_NET="testnet" -PREUSED_HEDERA_NET="testnet" MQ_ADDRESS="message-broker" SERVICE_CHANNEL="auth-service" -ACCESS_TOKEN_SECRET="youraccesstokensecret" DB_HOST="mongo" DB_DATABASE="auth_db" -VAULT_PROVIDER="database" -HASHICORP_TOKEN="1234" -HASHICORP_ADDRESS="http://vault:8200" -HASHICORP_NAMESPACE="admin" + HASHICORP_ENCRIPTION_ALG="sha512" MQ_MAX_PAYLOAD="1048576" #LOG_LEVEL="2" #HASHICORP_UNSEAL_KEY="" #IMPORT_KEYS_FROM_DB=1 #MQ_MESSAGE_CHUNK=5000000 + +# Vault Secret Manager Configs +VAULT_API_VERSION=v1 +VAULT_ADDRESS=https://vault:8200 + +VAULT_CA_CERT=tls/vault/client/ca.crt +VAULT_CLIENT_CERT=tls/vault/client/tls.crt +VAULT_CLIENT_KEY=tls/vault/client/tls.key + +VAULT_APPROLE_ROLE_ID= +VAULT_APPROLE_SECRET_ID= + +# AWS Secret Manager Configs +AWS_REGION= diff --git a/auth-service/.env.docker.example b/auth-service/.env.docker.example deleted file mode 100644 index d86cc7383e..0000000000 --- a/auth-service/.env.docker.example +++ /dev/null @@ -1,24 +0,0 @@ -MQ_ADDRESS="message-broker" -SERVICE_CHANNEL="auth-service" -DB_HOST="mongo" -DB_DATABASE="auth_db" - -HASHICORP_ENCRIPTION_ALG="sha512" - -#LOG_LEVEL="2" -#IMPORT_KEYS_FROM_DB=1 -#MQ_MESSAGE_CHUNK=5000000 - -# Vault Secret Manager Configs -VAULT_API_VERSION=v1 -VAULT_ADDRESS=https://vault:8200 - -VAULT_CA_CERT=tls/vault/client/ca.crt -VAULT_CLIENT_CERT=tls/vault/client/tls.crt -VAULT_CLIENT_KEY=tls/vault/client/tls.key - -VAULT_APPROLE_ROLE_ID= -VAULT_APPROLE_SECRET_ID= - -# AWS Secret Manager Configs -AWS_REGION= diff --git a/auth-service/.env.example b/auth-service/.env.example deleted file mode 100644 index b7c604dfd5..0000000000 --- a/auth-service/.env.example +++ /dev/null @@ -1,24 +0,0 @@ -MQ_ADDRESS="localhost" -SERVICE_CHANNEL="auth-service" -DB_HOST="localhost" -DB_DATABASE="auth_db" - -HASHICORP_ENCRIPTION_ALG="sha512" - -#LOG_LEVEL="2" -#IMPORT_KEYS_FROM_DB=1 -#MQ_MESSAGE_CHUNK=5000000 - -# Vault Secret Manager Configs -VAULT_API_VERSION=v1 -VAULT_ADDRESS=https://localhost:8200 - -VAULT_CA_CERT=tls/vault/client/ca.crt -VAULT_CLIENT_CERT=tls/vault/client/tls.crt -VAULT_CLIENT_KEY=tls/vault/client/tls.key - -VAULT_APPROLE_ROLE_ID= -VAULT_APPROLE_SECRET_ID= - -# AWS Secret Manager Configs -AWS_REGION= diff --git a/auth-service/.env.template b/auth-service/.env.template new file mode 100644 index 0000000000..dd4ffe0d89 --- /dev/null +++ b/auth-service/.env.template @@ -0,0 +1,2 @@ +GUARDIAN_ENV="" +#OVVERRIDE="false" \ No newline at end of file diff --git a/auth-service/Dockerfile b/auth-service/Dockerfile index c52b48d39b..62475f3570 100644 --- a/auth-service/Dockerfile +++ b/auth-service/Dockerfile @@ -36,7 +36,8 @@ COPY --from=interfacesModuleBuilder /usr/local/interfaces/guardian-interfaces-*. COPY --from=commonModuleBuilder /usr/local/common/guardian-common-*.tgz /tmp/common.tgz COPY --from=authServiceBuilder /usr/local/auth-service/yarn.lock ./ COPY ./auth-service/package.json ./ -# COPY ./auth-service/.env.docker ./.env +RUN mkdir -p ./configs +COPY ./auth-service/configs/* ./configs RUN node -e "const fs=require('fs'); const input=JSON.parse(fs.readFileSync('package.json')); input.dependencies['@guardian/interfaces']='file:/tmp/interfaces.tgz'; fs.writeFileSync('package.json', JSON.stringify(input));" RUN node -e "const fs=require('fs'); const input=JSON.parse(fs.readFileSync('package.json')); input.dependencies['@guardian/common']='file:/tmp/common.tgz'; fs.writeFileSync('package.json', JSON.stringify(input));" RUN yarn install --frozen-lockfile diff --git a/auth-service/configs/.env.auth b/auth-service/configs/.env.auth new file mode 100644 index 0000000000..5df57d6971 --- /dev/null +++ b/auth-service/configs/.env.auth @@ -0,0 +1,21 @@ +# Auth Service Specialized Variables +SERVICE_CHANNEL="auth-service" +DB_DATABASE="auth_db" +DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables +HEDERA_NET="testnet" +PREUSED_HEDERA_NET="testnet" +MQ_ADDRESS="localhost" +ACCESS_TOKEN_SECRET="youraccesstokensecret" +DB_HOST="localhost" +VAULT_PROVIDER="database" +HASHICORP_TOKEN="1234" +HASHICORP_ADDRESS="http://localhost:8200" +HASHICORP_NAMESPACE="admin" +HASHICORP_ENCRIPTION_ALG="sha512" +MQ_MAX_PAYLOAD="1048576" +#LOG_LEVEL="2" +#HASHICORP_UNSEAL_KEY="" +#IMPORT_KEYS_FROM_DB=1 +#MQ_MESSAGE_CHUNK=5000000 diff --git a/auth-service/configs/.env.auth.develop b/auth-service/configs/.env.auth.develop new file mode 100644 index 0000000000..a151dfd1fa --- /dev/null +++ b/auth-service/configs/.env.auth.develop @@ -0,0 +1,21 @@ +# Auth Service Specialized Variables +SERVICE_CHANNEL="auth-service" +DB_DATABASE="auth_db" +#DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables +HEDERA_NET="testnet" +PREUSED_HEDERA_NET="testnet" +MQ_ADDRESS="localhost" +ACCESS_TOKEN_SECRET="youraccesstokensecret" +DB_HOST="localhost" +VAULT_PROVIDER="database" +HASHICORP_TOKEN="1234" +HASHICORP_ADDRESS="http://localhost:8200" +HASHICORP_NAMESPACE="admin" +HASHICORP_ENCRIPTION_ALG="sha512" +MQ_MAX_PAYLOAD="1048576" +#LOG_LEVEL="2" +#HASHICORP_UNSEAL_KEY="" +#IMPORT_KEYS_FROM_DB=1 +#MQ_MESSAGE_CHUNK=5000000 diff --git a/auth-service/configs/.env.auth.template b/auth-service/configs/.env.auth.template new file mode 100644 index 0000000000..27145af8a9 --- /dev/null +++ b/auth-service/configs/.env.auth.template @@ -0,0 +1,21 @@ +# Auth Service Specialized Variables +SERVICE_CHANNEL="auth-service" +DB_DATABASE="auth_db" +DIRECT_MESSAGE_PORT="6555" + +# Ecosystem Defined Variables +HEDERA_NET="" +PREUSED_HEDERA_NET="" +MQ_ADDRESS="" +ACCESS_TOKEN_SECRET="youraccesstokensecret" +DB_HOST="" +VAULT_PROVIDER="database" +HASHICORP_TOKEN="1234" +HASHICORP_ADDRESS="" +HASHICORP_NAMESPACE="admin" +HASHICORP_ENCRIPTION_ALG="sha512" +MQ_MAX_PAYLOAD="" +#LOG_LEVEL="2" +#HASHICORP_UNSEAL_KEY="" +#IMPORT_KEYS_FROM_DB=1 +#MQ_MESSAGE_CHUNK=5000000 diff --git a/auth-service/package.json b/auth-service/package.json index ee94740f81..25a438487e 100644 --- a/auth-service/package.json +++ b/auth-service/package.json @@ -6,14 +6,20 @@ }, "author": "Envision Blockchain Solutions ", "dependencies": { - "@guardian/common": "^2.12.2", - "@guardian/interfaces": "^2.12.2", - "@mikro-orm/core": "~5.7.5", - "@mikro-orm/mongodb": "~5.7.5", + "@guardian/common": "^2.13.0-prerelease", + "@guardian/interfaces": "^2.13.0-prerelease", + "@mikro-orm/core": "~5.7.7", + "@mikro-orm/mongodb": "~5.7.7", + "@nestjs/common": "^9.4.1", + "@nestjs/core": "^9.4.1", + "@nestjs/microservices": "^9.4.1", "dotenv": "^16.0.0", + "express": "^4.17.1", "jsonwebtoken": "^8.5.1", "module-alias": "^2.2.2", "node-vault": "^0.9.22", + "prom-client": "^14.1.1", + "prometheus-api-metrics": "3.2.2", "reflect-metadata": "^0.1.13" }, "description": "", @@ -47,5 +53,6 @@ "start": "node dist/index.js", "test": "mocha tests/**/*.test.js --reporter mocha-junit-reporter --reporter-options mochaFile=../test_results/ui-service.xml" }, - "version": "2.12.2" + "version": "2.13.0-prerelease", + "stableVersion": "2.12.0" } diff --git a/auth-service/src/api/account-service.ts b/auth-service/src/api/account-service.ts index 60ad7ec9e5..cb91ff91e4 100644 --- a/auth-service/src/api/account-service.ts +++ b/auth-service/src/api/account-service.ts @@ -3,31 +3,27 @@ import { sign, verify } from 'jsonwebtoken'; import { User } from '@entity/user'; import * as util from 'util'; import crypto from 'crypto'; +import { DataBaseHelper, Logger, MessageError, MessageResponse, NatsService, SecretManager, Singleton } from '@guardian/common'; import { - MessageResponse, - MessageError, - Logger, - DataBaseHelper, NatsService, Singleton -} from '@guardian/common'; -import { - AuthEvents, UserRole, - IGetUserByTokenMessage, - IRegisterNewUserMessage, + AuthEvents, + GenerateUUIDv4, IGenerateTokenMessage, IGenerateTokenResponse, IGetAllUserResponse, IGetDemoUserResponse, - IGetUserMessage, - IUpdateUserMessage, - ISaveUserMessage, IGetUserByIdMessage, + IGetUserByTokenMessage, + IGetUserMessage, + IGetUsersByAccountMessage, IGetUsersByIdMessage, IGetUsersByIRoleMessage, - IUser, + IRegisterNewUserMessage, + ISaveUserMessage, IStandardRegistryUserResponse, - IGetUsersByAccountMessage, GenerateUUIDv4 + IUpdateUserMessage, + IUser, + UserRole } from '@guardian/interfaces'; -import { SecretManager } from '@guardian/common/dist/secret-manager'; /** * Account service diff --git a/auth-service/src/api/wallet-service.ts b/auth-service/src/api/wallet-service.ts index d656e11edf..0e5c9d409f 100644 --- a/auth-service/src/api/wallet-service.ts +++ b/auth-service/src/api/wallet-service.ts @@ -1,17 +1,6 @@ import { User } from '@entity/user'; -import { - MessageResponse, - MessageError, - Logger, - DataBaseHelper, NatsService, Singleton, -} from '@guardian/common'; -import { - WalletEvents, - IGetKeyMessage, - ISetKeyMessage, - IGetKeyResponse, - IGetGlobalApplicationKey, ISetGlobalApplicationKey, GenerateUUIDv4 -} from '@guardian/interfaces'; +import { DataBaseHelper, Logger, MessageError, MessageResponse, NatsService, Singleton, } from '@guardian/common'; +import { GenerateUUIDv4, IGetGlobalApplicationKey, IGetKeyMessage, IGetKeyResponse, ISetGlobalApplicationKey, ISetKeyMessage, WalletEvents } from '@guardian/interfaces'; import { IVault } from '../vaults'; /** diff --git a/auth-service/src/app.module.ts b/auth-service/src/app.module.ts new file mode 100644 index 0000000000..01068c524a --- /dev/null +++ b/auth-service/src/app.module.ts @@ -0,0 +1,4 @@ +import { Module } from '@nestjs/common'; + +@Module({}) +export class AppModule {} diff --git a/auth-service/src/app.ts b/auth-service/src/app.ts index faaaf8b46b..0a57186a4b 100644 --- a/auth-service/src/app.ts +++ b/auth-service/src/app.ts @@ -1,23 +1,16 @@ import { fixtures } from '@helpers/fixtures'; import { AccountService } from '@api/account-service'; import { WalletService } from '@api/wallet-service'; -import { - ApplicationState, - MessageBrokerChannel, - Logger, - DataBaseHelper, - Migration, - COMMON_CONNECTION_CONFIG, - LargePayloadContainer -} from '@guardian/common'; +import { ApplicationState, COMMON_CONNECTION_CONFIG, DataBaseHelper, LargePayloadContainer, Logger, MessageBrokerChannel, Migration, OldSecretManager, SecretManager } from '@guardian/common'; import { ApplicationStates } from '@guardian/interfaces'; import { MikroORM } from '@mikro-orm/core'; import { MongoDriver } from '@mikro-orm/mongodb'; import { InitializeVault } from './vaults'; import { ImportKeysFromDatabase } from '@helpers/import-keys-from-database'; import process from 'process'; -import { SecretManager } from '@guardian/common/dist/secret-manager'; -import { OldSecretManager } from '@guardian/common/dist/secret-manager/old-style/old-secret-manager'; +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; Promise.all([ Migration({ @@ -35,8 +28,17 @@ Promise.all([ ensureIndexes: true }), MessageBrokerChannel.connect('AUTH_SERVICE'), + NestFactory.createMicroservice(AppModule,{ + transport: Transport.NATS, + options: { + name: `${process.env.SERVICE_CHANNEL}`, + servers: [ + `nats://${process.env.MQ_ADDRESS}:4222` + ] + }, + }), InitializeVault(process.env.VAULT_PROVIDER) -]).then(async ([_, db, cn, vault]) => { +]).then(async ([_, db, cn, app, vault]) => { DataBaseHelper.orm = db; const state = new ApplicationState(); await state.setServiceName('AUTH_SERVICE').setConnection(cn).init(); @@ -44,6 +46,10 @@ Promise.all([ try { await fixtures(); + console.log(app); + + app.listen(); + new Logger().setConnection(cn); await new AccountService().setConnection(cn).init(); new AccountService().registerListeners(); @@ -74,6 +80,8 @@ Promise.all([ console.error(error.message); process.exit(1); } + + // startMetricsServer(); }, (reason) => { console.log(reason); process.exit(0); diff --git a/auth-service/src/config.ts b/auth-service/src/config.ts index fe48bc62a8..b3e587a95a 100644 --- a/auth-service/src/config.ts +++ b/auth-service/src/config.ts @@ -1,5 +1,6 @@ import moduleAlias from 'module-alias'; import dotenv from 'dotenv'; +import fs from 'fs'; moduleAlias.addAliases({ '@api': __dirname + '/api', @@ -8,3 +9,24 @@ moduleAlias.addAliases({ }); dotenv.config(); + +const envPath = process.env.GUARDIAN_ENV ? `./configs/.env.auth.${process.env.GUARDIAN_ENV}` : './configs/.env.auth'; + +if (!process.env.OVERRIDE || process.env.OVERRIDE === 'false'){ + console.log('reading from', envPath, 'not overriding'); + dotenv.config({ path: envPath}); +}else{ + try { + const envConfig = dotenv.parse(fs.readFileSync(envPath)); + for (const k of Object.keys(envConfig)) { + process.env[k] = envConfig[k] + } + } catch (err) { + if (err.code === 'ENOENT') { + console.log('WARN: Specific environment not loaded'); + } else { + throw err; + } + } +} +console.log('Charged Environment',process.env,'\r\n___ . ___'); diff --git a/auth-service/src/entity/user.ts b/auth-service/src/entity/user.ts index 4351153959..6077b80f5c 100644 --- a/auth-service/src/entity/user.ts +++ b/auth-service/src/entity/user.ts @@ -1,4 +1,4 @@ -import { Entity, Property, Enum, BeforeCreate, Unique } from '@mikro-orm/core'; +import { BeforeCreate, Entity, Enum, Property, Unique } from '@mikro-orm/core'; import { IUser, UserRole } from '@guardian/interfaces'; import { BaseEntity } from '@guardian/common'; diff --git a/auth-service/src/utils/metrics.ts b/auth-service/src/utils/metrics.ts new file mode 100644 index 0000000000..d4c86e45ed --- /dev/null +++ b/auth-service/src/utils/metrics.ts @@ -0,0 +1,20 @@ +import express from 'express'; +import client from 'prom-client'; +import guardianServicePrometheusMetrics from 'prometheus-api-metrics'; + +const app = express(); + +const PORT = process.env.METRICS_PORT || 5005; + +export const startMetricsServer = () => { + app.use(guardianServicePrometheusMetrics()); + app.get('/metrics', async (req, res) => { + res.set('Content-Type', client.register.contentType); + + return res.send(await client.register.metrics()); + }); + + app.listen(PORT, () => { + console.log(`auth-service metrics server started at http://localhost:${PORT}`); + }); +} diff --git a/common/package.json b/common/package.json index bdb746c2cd..9f78315a8b 100644 --- a/common/package.json +++ b/common/package.json @@ -2,13 +2,16 @@ "author": "Envision Blockchain Solutions ", "dependencies": { "@aws-sdk/client-secrets-manager": "^3.319.0", - "@guardian/interfaces": "^2.12.2", - "@hashgraph/sdk": "^2.22.0", + "@guardian/interfaces": "^2.13.0-prerelease", + "@hashgraph/sdk": "^2.24.2", "@mattrglobal/jsonld-signatures-bbs": "^1.1.2", "@meeco/cryppo": "^2.0.2", - "@mikro-orm/core": "~5.7.5", - "@mikro-orm/migrations-mongodb": "~5.7.5", - "@mikro-orm/mongodb": "~5.7.5", + "@mikro-orm/core": "~5.7.7", + "@mikro-orm/migrations-mongodb": "~5.7.7", + "@mikro-orm/mongodb": "~5.7.7", + "@nestjs/common": "^9.4.1", + "@nestjs/core": "^9.4.1", + "@nestjs/microservices": "^9.4.1", "@transmute/credentials-context": "^0.7.0-unstable.80", "@transmute/did-context": "^0.7.0-unstable.80", "@transmute/ed25519-signature-2018": "^0.7.0-unstable.80", @@ -25,8 +28,9 @@ "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "moment": "^2.29.2", - "mongodb": "^5.4.0", + "mongodb": "5.5.0", "nats": "^2.6.1", + "nestjs": "^0.0.1", "node-vault": "^0.9.22", "reflect-metadata": "^0.1.13", "winston": "^3.8.1", @@ -59,5 +63,6 @@ "test:local": "mocha tests/**/*.test.js --exit", "test:stability": "mocha tests/stability.test.js" }, - "version": "2.12.2" + "version": "2.13.0-prerelease", + "stableVersion": "2.12.0" } diff --git a/common/src/database-modules/database-server.ts b/common/src/database-modules/database-server.ts index f8b36bba54..243a8aa910 100644 --- a/common/src/database-modules/database-server.ts +++ b/common/src/database-modules/database-server.ts @@ -22,7 +22,8 @@ import { PolicyModule, Tag, TagCache, - Contract as ContractCollection + Contract as ContractCollection, + ExternalDocument } from '../entity'; import { Binary } from 'bson'; import { @@ -77,6 +78,7 @@ export class DatabaseServer { this.classMap.set(SplitDocuments, 'SplitDocuments'); this.classMap.set(Tag, 'Tag'); this.classMap.set(TagCache, 'TagCache'); + this.classMap.set(ExternalDocument, 'ExternalDocument'); } /** @@ -242,9 +244,25 @@ export class DatabaseServer { * @param criteria * @param row */ - private async update(entityClass: new () => T, criteria: any, row: T): Promise { + private async update( + entityClass: new () => T, + criteria: any, + row: any + ): Promise { if (this.dryRun) { - return await new DataBaseHelper(DryRun).update(row, criteria) as any; + if (Array.isArray(row)) { + for (const i of row) { + i.dryRunId = this.dryRun; + i.dryRunClass = this.classMap.get(entityClass); + } + } else { + row.dryRunId = this.dryRun; + row.dryRunClass = this.classMap.get(entityClass); + } + return (await new DataBaseHelper(DryRun).update( + row, + criteria + )) as any; } else { return await new DataBaseHelper(entityClass).update(row, criteria); } @@ -1345,6 +1363,69 @@ export class DatabaseServer { }); } + /** + * Get External Topic + * @param policyId + * @param blockId + * @param userId + * + * @virtual + */ + public async getExternalTopic( + policyId: string, + blockId: string, + userId: string + ): Promise { + return await this.findOne(ExternalDocument, { + where: { + policyId: { $eq: policyId }, + blockId: { $eq: blockId }, + owner: { $eq: userId } + } + }); + } + + /** + * Create External Topic + * @param row + * + * @virtual + */ + public async createExternalTopic(row: any): Promise { + const item = this.create(ExternalDocument, row); + return await this.save(ExternalDocument, item); + } + + /** + * Update External Topic + * @param row + * + * @virtual + */ + public async updateExternalTopic(item: ExternalDocument): Promise { + return await this.save(ExternalDocument, item); + } + + /** + * Get Active External Topic + * @param policyId + * @param blockId + * + * @virtual + */ + public async getActiveExternalTopics( + policyId: string, + blockId: string + ): Promise { + return await this.find(ExternalDocument, { + where: { + policyId: { $eq: policyId }, + blockId: { $eq: blockId }, + active: { $eq: true } + } + }); + } + /** * Create tag * @param tag diff --git a/common/src/document-loader/dry-run-loader.ts b/common/src/document-loader/dry-run-loader.ts new file mode 100644 index 0000000000..d939a7f9b4 --- /dev/null +++ b/common/src/document-loader/dry-run-loader.ts @@ -0,0 +1,44 @@ +import { DidRootKey, DocumentLoader, IDocumentFormat } from '../hedera-modules'; +import { DataBaseHelper } from '../helpers'; +import { DidDocument, DryRun } from '../entity'; + +/** + * Dry Run loader + */ +export class DryRunLoader extends DocumentLoader { + /** + * Has context + * @param iri + */ + public async has(iri: string): Promise { + const did = DidRootKey.create(iri).getController(); + const document= await new DataBaseHelper(DryRun).findOne({did, dryRunClass: 'DidDocumentCollection'}); + return !!document; + } + + /** + * Get formatted document + * @param iri + */ + public async get(iri: string): Promise { + const did = DidRootKey.create(iri).getController(); + const document= await new DataBaseHelper(DryRun).findOne({did, dryRunClass: 'DidDocumentCollection'}); + return { + documentUrl: iri, + document: document.document + }; + } + + /** + * Get document + * @param iri + */ + public async getDocument(iri: string): Promise { + const did = DidRootKey.create(iri).getController(); + const didDocuments = await new DataBaseHelper(DidDocument).findOne({ did }); + if (didDocuments) { + return didDocuments.document; + } + throw new Error(`DID not found: ${iri}`); + } +} diff --git a/common/src/document-loader/hedera-loader.ts b/common/src/document-loader/hedera-loader.ts new file mode 100644 index 0000000000..bc5ed74b81 --- /dev/null +++ b/common/src/document-loader/hedera-loader.ts @@ -0,0 +1,78 @@ +import { DidRootKey, DocumentLoader, IDocumentFormat } from '../hedera-modules'; +import { DataBaseHelper, IPFS, Workers } from '../helpers'; +import { DidDocument } from '../entity'; +import { WorkerTaskType } from '@guardian/interfaces'; + +/** + * Hedera loader + */ +export class HederaLoader extends DocumentLoader { + /** + * Has context + * @param iri + */ + public async has(iri: string): Promise { + if (!iri.startsWith('did:hedera:')) { + return false; + } + const document = await this.getDocument(iri); + return !document; + + } + + /** + * Get formatted document + * @param iri + */ + public async get(iri: string): Promise { + const did = DidRootKey.create(iri).getController(); + const splittedDid = did.split('_'); + const topicId = splittedDid[splittedDid.length - 1]; + + const messages = await new Workers().addRetryableTask( + { + type: WorkerTaskType.GET_TOPIC_MESSAGES, + data: { + operatorId: null, + operatorKey: null, + dryRun: false, + topic: topicId, + }, + }, + 10 + ); + const didMessage = messages + .map(m => { + try { + return JSON.parse(m.message); + } catch (e) { + return undefined; + } + }) + .find(m => { + return (m.type === 'DID-Document') && (m.did === did) + }); + if (!didMessage) { + return null + } + const didDocument = await IPFS.getFile(didMessage.cid, 'json') + + return { + documentUrl: iri, + document: didDocument + }; + } + + /** + * Get document + * @param iri + */ + public async getDocument(iri: string): Promise { + const did = DidRootKey.create(iri).getController(); + const didDocuments = await new DataBaseHelper(DidDocument).findOne({ did }); + if (didDocuments) { + return didDocuments.document; + } + return false; + } +} diff --git a/common/src/document-loader/index.ts b/common/src/document-loader/index.ts index a4f0691141..647362a7f8 100644 --- a/common/src/document-loader/index.ts +++ b/common/src/document-loader/index.ts @@ -3,3 +3,5 @@ export * from './did-document-loader'; export * from './schema-document-loader'; export * from './subject-schema-loader'; export * from './vc-schema-loader'; +export * from './dry-run-loader'; +export * from './hedera-loader'; diff --git a/common/src/entity/aggregate-documents.ts b/common/src/entity/aggregate-documents.ts index 20bf5ddeb1..65fbbe902a 100644 --- a/common/src/entity/aggregate-documents.ts +++ b/common/src/entity/aggregate-documents.ts @@ -56,7 +56,7 @@ export class AggregateVC extends BaseEntity { /** * Document instance */ - @Property({ nullable: true }) + @Property({ nullable: true, type: 'unknown' }) document?: IVC; /** @@ -182,6 +182,12 @@ export class AggregateVC extends BaseEntity { @Property({ nullable: true }) messageIds?: string[]; + /** + * Source document identifier + */ + @Property({ nullable: true }) + sourceDocumentId?: ObjectId; + /** * Create document */ diff --git a/common/src/entity/dry-run.ts b/common/src/entity/dry-run.ts index 5638a79ba4..a796ee4762 100644 --- a/common/src/entity/dry-run.ts +++ b/common/src/entity/dry-run.ts @@ -308,7 +308,7 @@ export class DryRun extends BaseEntity { /** * IRI */ - @Property({ nullable: true, type: 'unknown'}) + @Property({ nullable: true, type: 'unknown' }) iri?: any; /** @@ -545,6 +545,66 @@ export class DryRun extends BaseEntity { @Property({ nullable: true }) uri?: string; + /** + * Source document identifier + */ + @Property({ nullable: true }) + sourceDocumentId?: ObjectId; + + /** + * Document Topic Id + */ + @Property({ nullable: true, type: 'unknown' }) + documentTopicId?: any; + + /** + * Policy Topic Id + */ + @Property({ nullable: true, type: 'unknown' }) + policyTopicId?: any; + + /** + * Document Message + */ + @Property({ nullable: true, type: 'unknown' }) + documentMessage?: any; + + /** + * Policy Message + */ + @Property({ nullable: true, type: 'unknown' }) + policyMessage?: any; + + /** + * Policy Instance Message + */ + @Property({ nullable: true, type: 'unknown' }) + policyInstanceMessage?: any; + + /** + * Schemas + */ + @Property({ nullable: true, type: 'unknown' }) + schemas?: any; + + /** + * Schema Id + */ + @Property({ nullable: true, type: 'unknown' }) + schemaId?: any; + + /** + * Last Message + */ + @Property({ nullable: true, type: 'unknown' }) + lastMessage?: any; + + /** + * Last Update + */ + @Property({ nullable: true, type: 'unknown' }) + lastUpdate?: any; + /** * Default document values */ @@ -584,9 +644,9 @@ export class DryRun extends BaseEntity { if ( (typeof fieldValue === 'string' && fieldValue.length < - (+process.env - .DOCUMENT_CACHE_FIELD_LIMIT || - 100)) || + (+process.env + .DOCUMENT_CACHE_FIELD_LIMIT || + 100)) || typeof fieldValue === 'number' ) { ObjSet(newDocument, field, fieldValue); diff --git a/common/src/entity/external-document.ts b/common/src/entity/external-document.ts new file mode 100644 index 0000000000..ca86b651ad --- /dev/null +++ b/common/src/entity/external-document.ts @@ -0,0 +1,117 @@ +import { BeforeCreate, Entity, Property } from '@mikro-orm/core'; +import { BaseEntity } from '../models'; + +/** + * Artifact collection + */ +@Entity() +export class ExternalDocument extends BaseEntity { + /** + * Block UUID + */ + @Property({ nullable: true }) + blockId?: string; + + /** + * Policy id + */ + @Property({ + nullable: true, + index: true, + }) + policyId?: string; + + /** + * User + */ + @Property({ nullable: true }) + owner?: string; + + /** + * Document Topic Id + */ + @Property({ nullable: true }) + documentTopicId?: string; + + /** + * Policy Topic Id + */ + @Property({ nullable: true }) + policyTopicId?: string; + + /** + * Instance Topic Id + */ + @Property({ nullable: true }) + instanceTopicId?: string; + + /** + * Document Message + */ + @Property({ nullable: true, type: 'unknown' }) + documentMessage?: any; + + /** + * Policy Message + */ + @Property({ nullable: true, type: 'unknown' }) + policyMessage?: any; + + /** + * Policy Instance Message + */ + @Property({ nullable: true, type: 'unknown' }) + policyInstanceMessage?: any; + + /** + * Schemas + */ + @Property({ nullable: true, type: 'unknown' }) + schemas?: any[]; + + /** + * Schema + */ + @Property({ nullable: true, type: 'unknown' }) + schema?: any; + + /** + * Schema Id + */ + @Property({ nullable: true }) + schemaId?: string; + + /** + * Status + */ + @Property({ nullable: true }) + active?: boolean; + + /** + * Last Message + */ + @Property({ nullable: true }) + lastMessage?: string; + + /** + * Last Update + */ + @Property({ nullable: true }) + lastUpdate?: string; + + /** + * Status + */ + @Property({ nullable: true }) + status?: string; + + /** + * Default document values + */ + @BeforeCreate() + setDefaults() { + this.lastMessage = this.lastMessage || ''; + this.lastUpdate = this.lastUpdate || ''; + this.active = this.active || false; + } +} diff --git a/common/src/entity/index.ts b/common/src/entity/index.ts index b9290e8a56..0cdaf28956 100644 --- a/common/src/entity/index.ts +++ b/common/src/entity/index.ts @@ -24,4 +24,5 @@ export * from './token'; export * from './topic'; export * from './vc-document'; export * from './vp-document'; -export * from './theme'; \ No newline at end of file +export * from './theme'; +export * from './external-document'; \ No newline at end of file diff --git a/common/src/entity/multi-documents.ts b/common/src/entity/multi-documents.ts index b81d617ec7..c043d18b02 100644 --- a/common/src/entity/multi-documents.ts +++ b/common/src/entity/multi-documents.ts @@ -61,7 +61,7 @@ export class MultiDocuments extends BaseEntity { /** * Document instance */ - @Property({ persist: false }) + @Property({ persist: false, type: 'unknown' }) document?: IVC; /** diff --git a/common/src/entity/retire-request.ts b/common/src/entity/retire-request.ts index 6058f06257..65e16980e2 100644 --- a/common/src/entity/retire-request.ts +++ b/common/src/entity/retire-request.ts @@ -1,5 +1,6 @@ import { Entity, Property } from '@mikro-orm/core'; import { BaseEntity } from '../models'; +import { ObjectId } from 'mongodb'; /** * Retire Request @@ -58,5 +59,5 @@ export class RetireRequest extends BaseEntity { * Vc Document Hash */ @Property({ nullable: true }) - vcDocumentHash?: string; + documentId?: ObjectId; } \ No newline at end of file diff --git a/common/src/entity/vc-document.ts b/common/src/entity/vc-document.ts index 5665e1965a..cdec7d7637 100644 --- a/common/src/entity/vc-document.ts +++ b/common/src/entity/vc-document.ts @@ -10,7 +10,6 @@ import { Property, Enum, BeforeCreate, - Unique, OnLoad, BeforeUpdate, AfterDelete, @@ -27,10 +26,6 @@ import ObjSet from 'lodash.set'; * VC documents collection */ @Entity() -@Unique({ - properties: ['hash'], - options: { partialFilterExpression: { hash: { $type: 'string' } } }, -}) export class VcDocument extends BaseEntity implements IVCDocument { /** * Document owner @@ -64,7 +59,7 @@ export class VcDocument extends BaseEntity implements IVCDocument { */ @Property({ nullable: true, - // index: true + index: true }) hash?: string; diff --git a/common/src/entity/vp-document.ts b/common/src/entity/vp-document.ts index 697a3037b0..25b55c21a0 100644 --- a/common/src/entity/vp-document.ts +++ b/common/src/entity/vp-document.ts @@ -33,7 +33,7 @@ export class VpDocument extends BaseEntity implements IVPDocument { /** * Document instance */ - @Property({ nullable: true }) + @Property({ nullable: true, type: 'unknown' }) document?: IVP; /** diff --git a/common/src/hedera-modules/message/message-server.ts b/common/src/hedera-modules/message/message-server.ts index e297171031..635864a8bb 100644 --- a/common/src/hedera-modules/message/message-server.ts +++ b/common/src/hedera-modules/message/message-server.ts @@ -227,7 +227,7 @@ export class MessageServer { message.setLang(MessageServer.lang); const time = await this.messageStartLog('Hedera'); const buffer = message.toMessage(); - const id = await new Workers().addRetryableTask({ + const timestamp = await new Workers().addRetryableTask({ type: WorkerTaskType.SEND_HEDERA, data: { topicId: this.topicId, @@ -241,7 +241,7 @@ export class MessageServer { } }, 10); await this.messageEndLog(time, 'Hedera'); - message.setId(id); + message.setId(timestamp); message.setTopicId(this.topicId); return message; } @@ -336,6 +336,8 @@ export class MessageServer { new Logger().info(`getTopicMessage, ${timeStamp}, ${topicId}, ${message}`, ['GUARDIAN_SERVICE']); const result = MessageServer.fromMessage(message, type); + result.setAccount(message.payer_account_id); + result.setIndex(message.sequence_number); result.setId(timeStamp); result.setTopicId(topicId); return result; @@ -346,12 +348,18 @@ export class MessageServer { * @param topicId * @param type * @param action + * @param timestamp * @private */ - private async getTopicMessages(topicId: string | TopicId, type?: MessageType, action?: MessageAction): Promise { + private async getTopicMessages( + topicId: string | TopicId, + type?: MessageType, + action?: MessageAction, + timestamp?: string + ): Promise { const { operatorId, operatorKey, dryRun } = this.clientOptions; - if(!topicId) { + if (!topicId) { throw new Error(`Invalid Topic Id`); } @@ -363,7 +371,8 @@ export class MessageServer { operatorId, operatorKey, dryRun, - topic + topic, + timestamp } }, 10); @@ -380,6 +389,8 @@ export class MessageServer { filter = filter && item.action === action; } if (filter) { + item.setAccount(message.payer_account_id); + item.setIndex(message.sequence_number); item.setId(message.id); item.setTopicId(topic); result.push(item); @@ -470,6 +481,55 @@ export class MessageServer { return await this.loadIPFS(message); } + /** + * Load documents + * @param message + */ + public async loadDocuments(messages: T[]): Promise { + for (const message of messages) { + const urls = message.getUrls(); + const documents: any[] = []; + for (const url of urls) { + const doc = await this.getFile(url.cid, message.responseType); + documents.push(doc); + } + await message.loadDocuments(documents, this.clientOptions.operatorKey); + } + return messages; + } + + /** + * Load document + * @param message + */ + public static async loadDocument(message: T, cryptoKey?: string): Promise { + const urls = message.getUrls(); + const documents: any[] = []; + for (const url of urls) { + const doc = await IPFS.getFile(url.cid, message.responseType); + documents.push(doc); + } + await message.loadDocuments(documents, cryptoKey); + return message; + } + + /** + * Load documents + * @param message + */ + public static async loadDocuments(messages: T[], cryptoKey?: string): Promise { + for (const message of messages) { + const urls = message.getUrls(); + const documents: any[] = []; + for (const url of urls) { + const doc = await IPFS.getFile(url.cid, message.responseType); + documents.push(doc); + } + await message.loadDocuments(documents, cryptoKey); + } + return messages; + } + /** * Find topic * @param messageId @@ -496,4 +556,88 @@ export class MessageServer { return null; } } + + /** + * Get messages + * @param topicId + * @param type + * @param action + */ + public static async getMessages( + topicId: string | TopicId, + type?: MessageType, + action?: MessageAction, + timestamp?: string + ): Promise { + if (!topicId) { + throw new Error(`Invalid Topic Id`); + } + const topic = topicId.toString(); + const workers = new Workers(); + const messages = await workers.addRetryableTask({ + type: WorkerTaskType.GET_TOPIC_MESSAGES, + data: { + topic, + timestamp + } + }, 10); + new Logger().info(`getTopicMessages, ${topic}`, ['GUARDIAN_SERVICE']); + const result: Message[] = []; + for (const message of messages) { + try { + const item = MessageServer.fromMessage(message.message); + let filter = true; + if (type) { + filter = filter && item.type === type; + } + if (action) { + filter = filter && item.action === action; + } + if (filter) { + item.setAccount(message.payer_account_id); + item.setIndex(message.sequence_number); + item.setId(message.id); + item.setTopicId(topic); + result.push(item); + } + } catch (error) { + continue; + } + } + return result as T[]; + } + + /** + * Get messages + * @param topicId + */ + public static async getTopic(topicId: string | TopicId): Promise { + if (!topicId) { + throw new Error(`Invalid Topic Id`); + } + const topic = topicId.toString(); + const workers = new Workers(); + const message = await workers.addRetryableTask({ + type: WorkerTaskType.GET_TOPIC_MESSAGE_BY_INDEX, + data: { + topic, + index: 1 + } + }, 10); + new Logger().info(`getTopic, ${topic}`, ['GUARDIAN_SERVICE']); + try { + const json = JSON.parse(message.message); + if (json.type === MessageType.Topic) { + const item = TopicMessage.fromMessageObject(json); + item.setAccount(message.payer_account_id); + item.setIndex(message.sequence_number); + item.setId(message.id); + item.setTopicId(topic); + return item; + } + return null; + } catch (error) { + return null; + } + } } diff --git a/common/src/hedera-modules/message/message.ts b/common/src/hedera-modules/message/message.ts index c60e466181..97e4e9c843 100644 --- a/common/src/hedera-modules/message/message.ts +++ b/common/src/hedera-modules/message/message.ts @@ -49,6 +49,14 @@ export abstract class Message { * Message type */ public type: MessageType; + /** + * Payer + */ + public payer: string; + /** + * Index + */ + public index: string | number; /** * Response type @@ -157,6 +165,22 @@ export abstract class Message { this.topicId = topicId; } + /** + * Set payer + * @param payer + */ + public setAccount(payer: string): void { + this.payer = payer; + } + + /** + * Set index + * @param index + */ + public setIndex(index: string | number): void { + this.index = index; + } + /** * Get URL */ diff --git a/common/src/hedera-modules/vcjs/vcjs.ts b/common/src/hedera-modules/vcjs/vcjs.ts index 4a3d1ad474..52f5d7593f 100644 --- a/common/src/hedera-modules/vcjs/vcjs.ts +++ b/common/src/hedera-modules/vcjs/vcjs.ts @@ -291,16 +291,21 @@ export class VCJS { * * @param {HcsVcDocument} vcDocument - VC Document * + * @param loader * @returns {Promise} - is verified */ - public async verifyVC(vcDocument: VcDocument | any): Promise { + public async verifyVC(vcDocument: VcDocument | any, loader?: DocumentLoaderFunction): Promise { let vc: IVC; if (vcDocument && typeof vcDocument.toJsonTree === 'function') { vc = vcDocument.toJsonTree(); } else { vc = vcDocument; } - return await this.verify(vc, this.loader); + if (!loader) { + return await this.verify(vc, this.loader); + } else { + return await this.verify(vc, loader) + } } /** diff --git a/common/src/helpers/common.module.ts b/common/src/helpers/common.module.ts new file mode 100644 index 0000000000..70b3db7466 --- /dev/null +++ b/common/src/helpers/common.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; + +@Module({ + providers: [ + ] +}) +export class CommonModule {} diff --git a/common/src/helpers/db-helper.ts b/common/src/helpers/db-helper.ts index 04bf57dd40..fc673604dc 100644 --- a/common/src/helpers/db-helper.ts +++ b/common/src/helpers/db-helper.ts @@ -14,9 +14,9 @@ import { GridFSBucket } from 'mongodb'; export const COMMON_CONNECTION_CONFIG: any = { type: 'mongo', namingStrategy: DataBaseNamingStrategy, - dbName: (process.env.ENV||(process.env.HEDERA_NET!==process.env.PREUSED_HEDERA_NET))? - `${process.env.ENV}_${process.env.HEDERA_NET}_${process.env.DB_DATABASE}`: - process.env.DB_DATABASE, + dbName: (process.env.GUARDIAN_ENV||(process.env.HEDERA_NET!==process.env.PREUSED_HEDERA_NET))? + `${process.env.GUARDIAN_ENV}_${process.env.HEDERA_NET}_${process.env.DB_DATABASE}`: + process.env.DB_DATABASE, clientUrl:`mongodb://${process.env.DB_HOST}`, entities: [ 'dist/entity/*.js' @@ -122,7 +122,7 @@ export class DataBaseHelper { * @param entities Entities */ public create(entities: any[]): T[]; - public create(entity: any | any[]): T | T[]{ + public create(entity: any | any[]): T | T[] { if (Array.isArray(entity)) { const arrResult = []; for (const item of entity) { diff --git a/common/src/helpers/logger.module.ts b/common/src/helpers/logger.module.ts new file mode 100644 index 0000000000..c2c66d7180 --- /dev/null +++ b/common/src/helpers/logger.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import process from 'process'; + +@Module({ + imports: [ + ClientsModule.register([{ + name: 'LOGGER', + transport: Transport.NATS, + options: { + servers: [ + `nats://${process.env.MQ_ADDRESS}:4222` + ] + } + }]), + ], +}) +export class LoggerModule {} diff --git a/common/src/helpers/migration.ts b/common/src/helpers/migration.ts index 58bc519b24..b48df89b55 100644 --- a/common/src/helpers/migration.ts +++ b/common/src/helpers/migration.ts @@ -1,12 +1,24 @@ import { MikroORM } from '@mikro-orm/core'; +import { MongoDriver } from '@mikro-orm/mongodb'; /** * Define migration process - * @param initalConfig Config + * @param initConfig Config */ -export async function Migration(initalConfig: any) { - const orm = await MikroORM.init(initalConfig); - const migrator = orm.getMigrator(); - await migrator.up(); - await orm.close(true); +export async function Migration(initConfig: any, migrations?: string[]) { + const orm = await MikroORM.init(initConfig); + const migrator = orm.getMigrator(); + const executedMigrations = await migrator.getExecutedMigrations(); + const executeOldMigrations = async (name: string) => { + if (!executedMigrations.some((migration) => migration.name === name)) { + await migrator.up(name); + } + }; + if (migrations) { + for (const name of migrations) { + await executeOldMigrations(name); + } + } + await migrator.up(); + return orm; }; \ No newline at end of file diff --git a/common/src/helpers/vc-helper.ts b/common/src/helpers/vc-helper.ts index 4cf28afd1b..cae0a6347e 100644 --- a/common/src/helpers/vc-helper.ts +++ b/common/src/helpers/vc-helper.ts @@ -9,7 +9,7 @@ import { VCSchemaLoader, SubjectSchemaLoader, DIDDocumentLoader, - ContextDocumentLoader, + ContextDocumentLoader, DryRunLoader, HederaLoader, } from '../document-loader'; import { ICredentialSubject, @@ -35,7 +35,9 @@ export class VcHelper extends VCJS { constructor() { super(); const defaultDocumentLoader = new DefaultDocumentLoader(); + const dryRunLoader = new DryRunLoader(); const didDocumentLoader = new DIDDocumentLoader(); + const hederaLoader = new HederaLoader(); const schemaDocumentLoader = new SchemaDocumentLoader(); const contextDocumentLoader = new ContextDocumentLoader(''); @@ -43,6 +45,8 @@ export class VcHelper extends VCJS { const subjectSchemaObjectLoader = new SubjectSchemaLoader(''); this.addDocumentLoader(defaultDocumentLoader); + this.addDocumentLoader(dryRunLoader); + this.addDocumentLoader(hederaLoader); this.addDocumentLoader(didDocumentLoader); this.addDocumentLoader(schemaDocumentLoader); this.addDocumentLoader(contextDocumentLoader); @@ -235,4 +239,4 @@ export class VcHelper extends VCJS { } return await super.createVP(did, key, vcs, uuid); } -} \ No newline at end of file +} diff --git a/common/src/index.ts b/common/src/index.ts index 603e2cd0b8..4a4f652abe 100644 --- a/common/src/index.ts +++ b/common/src/index.ts @@ -8,5 +8,6 @@ export * from './interfaces'; export * from './entity'; export * from './document-loader'; export * from './hedera-modules'; -export * from './database-modules' +export * from './database-modules'; +export * from './secret-manager'; export const entities = Object.values(ent); diff --git a/common/src/models/base-entity.ts b/common/src/models/base-entity.ts index e7317ce030..2650a2bacc 100644 --- a/common/src/models/base-entity.ts +++ b/common/src/models/base-entity.ts @@ -21,7 +21,9 @@ export abstract class BaseEntity { * Created at */ @Property({ - index: true + index: true, + nullable: true, + type: 'unknown' }) createDate: Date = new Date(); diff --git a/common/src/mq/index.ts b/common/src/mq/index.ts index 3910e39713..75afc0fa21 100644 --- a/common/src/mq/index.ts +++ b/common/src/mq/index.ts @@ -2,3 +2,5 @@ export * from './message-broker-channel' export * from './external-channel' export * from './nats-service' export * from './large-payload-container' +export * from './zip-codec' +export * from './serialization' diff --git a/common/src/mq/message-broker-channel.ts b/common/src/mq/message-broker-channel.ts index 5de78f027f..35b24e662b 100644 --- a/common/src/mq/message-broker-channel.ts +++ b/common/src/mq/message-broker-channel.ts @@ -1,6 +1,6 @@ import assert from 'assert'; import { Subscription, NatsConnection, StringCodec, connect, headers } from 'nats'; -import { IMessageResponse, MessageError } from '../models/message-response'; +import { IMessageResponse, MessageError } from '../models'; import { GenerateUUIDv4 } from '@guardian/interfaces'; import { ZipCodec } from './zip-codec'; diff --git a/common/src/mq/nats-service.ts b/common/src/mq/nats-service.ts index 6281ec0476..3d369f96a6 100644 --- a/common/src/mq/nats-service.ts +++ b/common/src/mq/nats-service.ts @@ -33,6 +33,7 @@ export abstract class NatsService { constructor() { this.codec = ZipCodec(); + // this.codec = JSONCodec(); } /** diff --git a/common/src/mq/serialization.ts b/common/src/mq/serialization.ts new file mode 100644 index 0000000000..1090d70b77 --- /dev/null +++ b/common/src/mq/serialization.ts @@ -0,0 +1,31 @@ +import { Serializer, ConsumerDeserializer, IncomingRequest } from '@nestjs/microservices'; + +/** + * NestJS deserializer + */ +export class InboundMessageIdentityDeserializer implements ConsumerDeserializer { + /** + * Deserialize + * @param value + * @param options + */ + deserialize(value: any, options?: Record): IncomingRequest { + console.log(value, options); + return value; + } +} + +/** + * NestJS serializer + */ +export class OutboundResponseIdentitySerializer implements Serializer { + /** + * Serialize + * @param value + * @param options + */ + serialize(value: any, options?: Record): any { + console.log(value, options); + return value; + } +} diff --git a/common/src/mq/zip-codec.ts b/common/src/mq/zip-codec.ts index c9cdac57cc..2438fe88e7 100644 --- a/common/src/mq/zip-codec.ts +++ b/common/src/mq/zip-codec.ts @@ -1,6 +1,6 @@ -import { ErrorCode, NatsError } from 'nats'; -import util from 'util'; -import { gzip, unzip } from 'zlib'; +import { ErrorCode, JSONCodec, NatsError } from 'nats'; +// import util from 'util'; +// import { gzip, unzip } from 'zlib'; import { LargePayloadContainer } from './large-payload-container'; import axios from 'axios'; @@ -16,14 +16,18 @@ export function ZipCodec() { d = null; } - const zipped = await util.promisify(gzip)(JSON.stringify(d)); + // const zipped = await util.promisify(gzip)(JSON.stringify(d)); + const zipped = JSONCodec().encode(d); const maxPayload = parseInt(process.env.MQ_MAX_PAYLOAD, 10); if (Number.isInteger(maxPayload) && maxPayload <= zipped.length) { - const directLink = new LargePayloadContainer().addObject(zipped); + const directLink = new LargePayloadContainer().addObject(zipped.buffer as Buffer); console.log(directLink.toString(), zipped.length); - return await util.promisify(gzip)(JSON.stringify({ + return JSONCodec().encode({ directLink - })) + }) + // return await util.promisify(gzip)(JSON.stringify({ + // directLink + // })) } else { return zipped; } @@ -34,15 +38,17 @@ export function ZipCodec() { }, async decode(a) { try { - const decompressed = await util.promisify(unzip)(a); - const parsed = JSON.parse(decompressed.toString()); + const parsed = JSONCodec().decode(a) as any; + // const decompressed = await util.promisify(unzip)(a); + // const parsed = JSON.parse(decompressed.toString()); if (parsed?.hasOwnProperty('directLink')) { const directLink = parsed.directLink; const response = await axios.get(directLink, { responseType: 'arraybuffer' }); const compressedData = response.data.buffer; - const _decompressed = await util.promisify(unzip)(compressedData) + // const _decompressed = await util.promisify(unzip)(compressedData) + const _decompressed = compressedData; console.log(directLink, JSON.parse(_decompressed.toString())); return JSON.parse(_decompressed.toString()); } diff --git a/common/src/secret-manager/index.ts b/common/src/secret-manager/index.ts index 6a92a57a76..3dde6c08f5 100644 --- a/common/src/secret-manager/index.ts +++ b/common/src/secret-manager/index.ts @@ -1,4 +1,5 @@ export * from './secret-manager-base'; export * from './secret-manager-config-base'; export * from './secret-manager'; -export * from './secret-manager-config'; \ No newline at end of file +export * from './secret-manager-config'; +export * from './old-style/old-secret-manager' diff --git a/configs/.env..guardian.system b/configs/.env..guardian.system new file mode 100644 index 0000000000..37dcc1cb91 --- /dev/null +++ b/configs/.env..guardian.system @@ -0,0 +1,90 @@ +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# OVERRIDE="false" + +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="testnet" + +# PRE USED HEDERA_NET +# --------------------- +PREUSED_HEDERA_NET="testnet" + +# TESTNET +OPERATOR_ID="..." +OPERATOR_KEY="..." +INITIALIZATION_TOPIC_ID="0.0.2030" + +# # LOCALNODE +# LOCALNODE_ADDRESS="..." +# LOCALNODE_PROTOCOL="http" +# OPERATOR_ID="0.0.2" +# OPERATOR_KEY="302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137" + +# # PREVIEWNET +# OPERATOR_ID="..." +# OPERATOR_KEY="..." +# INITIALIZATION_TOPIC_ID="0.0.155110" + +SEND_KEYS_TO_VAULT="TRUE" +CONTRACT_FILE_ID="0.0.6276" +MAX_HEDERA_TIMEOUT="600" +# HEDERA_CUSTOM_NODES={"0.testnet.hedera.com:50211":"0.0.3"} +# HEDERA_CUSTOM_MIRROR_NODES=["testnet.mirrornode.hedera.com:443"] + +# MAX_TRANSACTION_FEE="10" + +# ADDRESSING / SERVICES +# ---------------------- +MQ_ADDRESS="message-broker" +MQ_MAX_PAYLOAD="1048576" + +MRV_ADDRESS="http://message-broker:3003/mrv" + +DB_HOST="mongo" + +ACCESS_TOKEN_SECRET="youraccesstokensecret" + +VAULT_PROVIDER="database" +HASHICORP_TOKEN="1234" +HASHICORP_ADDRESS="http://vault:8200" +HASHICORP_NAMESPACE="admin" +HASHICORP_ENCRIPTION_ALG="sha512" +#HASHICORP_UNSEAL_KEY="" + +#MAP_API_KEY="..." +MIN_PRIORITY="0" +MAX_PRIORITY="20" +TASK_TIMEOUT="300" +REFRESH_INTERVAL="60" + +IPFS_TIMEOUT="720" +IPFS_PROVIDER="web3storage" # 'web3storage' or 'local' +IPFS_PUBLIC_GATEWAY='https://ipfs.io/ipfs/${cid}' +IPFS_STORAGE_API_KEY="..." +IPFS_NODE_ADDRESS="http://ipfs-node:5002" + +#BATCH_NFT_MINT_SIZE=10 +# FE/DEMO +# -------------- +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# COMMONS +# ---------- +MESSAGE_LANG="en-US" +#LOG_LEVEL="2" +TRANSACTION_LOG_LEVEL="1" +MULTI_POLICY_SCHEDULER="0 0 * * *" +#DOCUMENT_CACHE_FIELD_LIMIT=100 + +# FEATURES +# -------------- +BBS_SIGNATURES_MODE="WASM" +# IMPORT_KEYS_FROM_DB=1 +# MQ_MESSAGE_CHUNK=5000000 +# RAW_REQUEST_LIMIT="1gb" +# JSON_REQUEST_LIMIT="1mb" + diff --git a/configs/.env.template.guardian.system b/configs/.env.template.guardian.system new file mode 100644 index 0000000000..ce52c9c545 --- /dev/null +++ b/configs/.env.template.guardian.system @@ -0,0 +1,108 @@ +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# this paramenter allows to override the environment variables at service level +# with the service-specific environment also if already defined at root level. +# Setting the parameter to "true" is not recommended. +# if not specified default Value "false" +# OVERRIDE="false" + +# HEDERA NETWORK +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="testnet" + +# PRE USED HEDERA_NET +# --------------------- +# Configure this value just once and keep the same setting for all subsequent configurations. +# If it is first Guardian installation or don't care about your previous data (demo) use default +# or remove from the configuration. +# Otherwise read carfully: +# Definition: as PRE USED hedera network is intended the Hedera network that you already started to use actively +# and where your important data is stored currently when you installed this release. +# for example if you are used to work on Hedera mainnet configure it as +# PREUSED_HEDERA_NET="mainnet" +# Configure this value just once and keep the same setting for all subsequent configurations. +# if not specified default Value is NULL +# PREUSED_HEDERA_NET="" + +# HEDERA - NETWORKS + +# TESTNET +OPERATOR_ID="..." +OPERATOR_KEY="..." +INITIALIZATION_TOPIC_ID="0.0.2030" + +# LOCALNODE +# LOCALNODE_ADDRESS="..." +# LOCALNODE_PROTOCOL="http" +# OPERATOR_ID="0.0.2" +# OPERATOR_KEY="302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137" + +# PREVIEWNET +# OPERATOR_ID="..." +# OPERATOR_KEY="302e020100300506032b657004220420f6cec1af811fe09394d635352e583ac3ce84fc180bf328b9cc21e8f58f67e323" +# INITIALIZATION_TOPIC_ID="0.0.155110" + +MAX_HEDERA_TIMEOUT="600" +# HEDERA_CUSTOM_NODES={"0.testnet.hedera.com:50211":"0.0.3"} +# HEDERA_CUSTOM_MIRROR_NODES=["testnet.mirrornode.hedera.com:443"] + +CONTRACT_FILE_ID="0.0.6276" + +# MAX_TRANSACTION_FEE="10" + +# ADDRESSING / SERVICES +# ---------------------- +MQ_ADDRESS="message-broker" +MQ_MAX_PAYLOAD="1048576" + +MRV_ADDRESS="http://message-broker:3003/mrv" + +DB_HOST="mongo" + +ACCESS_TOKEN_SECRET="youraccesstokensecret" + +SEND_KEYS_TO_VAULT="TRUE" +VAULT_PROVIDER="database" +HASHICORP_TOKEN="1234" +HASHICORP_ADDRESS="http://vault:8200" +HASHICORP_NAMESPACE="admin" +HASHICORP_ENCRIPTION_ALG="sha512" +#HASHICORP_UNSEAL_KEY="" + +#MAP_API_KEY="..." +MIN_PRIORITY="0" +MAX_PRIORITY="20" +TASK_TIMEOUT="300" +REFRESH_INTERVAL="60" + +IPFS_TIMEOUT="720" +IPFS_PROVIDER="web3storage" # 'web3storage' or 'local' +IPFS_PUBLIC_GATEWAY='https://ipfs.io/ipfs/${cid}' +IPFS_STORAGE_API_KEY="..." +IPFS_NODE_ADDRESS="http://ipfs-node:5002" +#BATCH_NFT_MINT_SIZE=10 + +# FE/DEMO +# -------------- +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# COMMONS +# ---------- +MESSAGE_LANG="en-US" +TRANSACTION_LOG_LEVEL="1" +MULTI_POLICY_SCHEDULER="0 0 * * *" +#LOG_LEVEL="2" +#DOCUMENT_CACHE_FIELD_LIMIT=100 + +# FEATURES +# -------------- +BBS_SIGNATURES_MODE="WASM" +# IMPORT_KEYS_FROM_DB=1 +# MQ_MESSAGE_CHUNK=5000000 +# RAW_REQUEST_LIMIT="1gb" +# JSON_REQUEST_LIMIT="1mb" + diff --git a/configs/.env_SSV b/configs/.env_SSV new file mode 100644 index 0000000000..5123345800 --- /dev/null +++ b/configs/.env_SSV @@ -0,0 +1,45 @@ +## GUARDIAN ECOSYSTEM ENVIRONMENT NAME +# if you already started to use actively Guardian leave GUARDIAN_ENV empty +GUARDIAN_ENV="develop" + +## VARIABLES DEDICATED TO SPECIFIC SERVICES + +#Api-service +API_SERVICE_CHANNEL="api-gateway" + +# Auth-service +AUTH_SERVICE_CHANNEL="auth-service" +AUTH_ACCESS_TOKEN_SECRET="youraccesstokensecret" +AUTH_DB_DATABASE="auth_db" + +# guardian-service +GUARDIAN_SERVICE_CHANNEL="guardian.1" +GUARDIAN_DB_DATABASE="guardian_db" +GUARDIAN_LOG_LEVEL="1" +GUARDIAN_MULTI_POLICY_SCHEDULER="0 0 * * *" + +# logger-service +LOGGER_SERVICE_CHANNEL="logger-service" +LOGGER_DB_DATABASE="logger_db" + +# policy-service +POLICY_SERVICE_CHANNEL="policy-service" +POLICY_DB_DATABASE="guardian_db" +POLICY_LOG_LEVEL="1" +POLICY_MULTI_POLICY_SCHEDULER="0 0 * * *" +EXTERNAL_DOCUMENTS_SCHEDULER="0 0 * * *" + +# worker-service +WORKER_1_SERVICE_CHANNEL="worker.1" +WORKER_2_SERVICE_CHANNEL="worker.2" + + + + + + + + + + + diff --git a/docker-compose-DEV-ONLYSERVERS copy.yml b/docker-compose-DEV-ONLYSERVERS copy.yml new file mode 100644 index 0000000000..d85abc9d86 --- /dev/null +++ b/docker-compose-DEV-ONLYSERVERS copy.yml @@ -0,0 +1,63 @@ +version: "3.8" +services: + mongo: + image: mongo:6.0.3 + command: "--setParameter allowDiskUseByDefault=true" + restart: always + expose: + - 27017 + ports: + - 27017:27017 + + mongo-express: + image: mongo-express:1.0.0-alpha.4 + expose: + - 8081 + environment: + ME_CONFIG_MONGODB_SERVER: mongo + ME_CONFIG_MONGODB_PORT: 27017 + ME_CONFIG_SITE_BASEURL: /mongo-admin + depends_on: + - mongo + + # ipfs-node: + # image: ipfs/kubo:v0.17.0 + # ports: + # - "5001:5001" + # - "5002:5002" + # - "4001:4001" + # - "4002:4002" + # - "8080:8080" + # - "8081:8081" + + # api-docs: + # build: + # context: . + # dockerfile: ./api-docs/Dockerfile + # expose: + # - 3001 + + message-broker: + image: nats:2.9.8 + expose: + - 4222 + ports: + - '8222:8222' + - '4222:4222' + - '6222:6222' + command: '--http_port 8222' + + vault: + image: vault:1.12.2 + expose: + - 8200 + ports: + - '8200:8200' + environment: + VAULT_SERVER: "http://0.0.0.0:8200" + VAULT_DEV_ROOT_TOKEN_ID: "1234" + cap_add: + - IPC_LOCK + volumes: + - ./file:/vault/file:rw + - ./config:/vault/config:rw diff --git a/docker-compose-DEV-ONLYSERVERS.yml b/docker-compose-DEV-ONLYSERVERS.yml new file mode 100644 index 0000000000..d85abc9d86 --- /dev/null +++ b/docker-compose-DEV-ONLYSERVERS.yml @@ -0,0 +1,63 @@ +version: "3.8" +services: + mongo: + image: mongo:6.0.3 + command: "--setParameter allowDiskUseByDefault=true" + restart: always + expose: + - 27017 + ports: + - 27017:27017 + + mongo-express: + image: mongo-express:1.0.0-alpha.4 + expose: + - 8081 + environment: + ME_CONFIG_MONGODB_SERVER: mongo + ME_CONFIG_MONGODB_PORT: 27017 + ME_CONFIG_SITE_BASEURL: /mongo-admin + depends_on: + - mongo + + # ipfs-node: + # image: ipfs/kubo:v0.17.0 + # ports: + # - "5001:5001" + # - "5002:5002" + # - "4001:4001" + # - "4002:4002" + # - "8080:8080" + # - "8081:8081" + + # api-docs: + # build: + # context: . + # dockerfile: ./api-docs/Dockerfile + # expose: + # - 3001 + + message-broker: + image: nats:2.9.8 + expose: + - 4222 + ports: + - '8222:8222' + - '4222:4222' + - '6222:6222' + command: '--http_port 8222' + + vault: + image: vault:1.12.2 + expose: + - 8200 + ports: + - '8200:8200' + environment: + VAULT_SERVER: "http://0.0.0.0:8200" + VAULT_DEV_ROOT_TOKEN_ID: "1234" + cap_add: + - IPC_LOCK + volumes: + - ./file:/vault/file:rw + - ./config:/vault/config:rw diff --git a/docker-compose.yml b/docker-compose.yml index 01fd8e2336..18ab170499 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,8 @@ services: restart: always expose: - 27017 + ports: + - "27017:27017" mongo-express: image: mongo-express:1.0.0-alpha.4 @@ -61,20 +63,25 @@ services: - ./file:/vault/file:rw - ./config:/vault/config:rw +# https://docs.docker.com/compose/environment-variables/envvars-precedence/ +# Environment leverage the gerarchy defined in the docker compose between "env_file" and "environment" attributes +# ecosystem variables defined in the "env_file" .env.${GUARDIAN_ENV}.guardian.system +# specific service variables defined by "environment" can override what is defined in the ecosystem file + logger-service: env_file: - - ./logger-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./logger-service/Dockerfile depends_on: - message-broker environment: - - ENV=${GUARDIAN_ENV} + - GUARDIAN_ENV=${GUARDIAN_ENV} worker-service-1: env_file: - - ./worker-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./worker-service/Dockerfile @@ -82,15 +89,14 @@ services: - ipfs-node - auth-service environment: - - SERVICE_CHANNEL=worker.1 - - ENV=${GUARDIAN_ENV} - - DIRECT_MESSAGE_PORT=6555 + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL:"worker.1" expose: - 6555 worker-service-2: env_file: - - ./worker-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./worker-service/Dockerfile @@ -98,32 +104,33 @@ services: - ipfs-node - auth-service environment: - - SERVICE_CHANNEL=worker.2 - - ENV=${GUARDIAN_ENV} - - DIRECT_MESSAGE_PORT=6555 + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL="worker.2" expose: - 6555 auth-service: env_file: - - ./auth-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./auth-service/Dockerfile + ports: + - '5005:5005' depends_on: - mongo - vault - message-broker - logger-service environment: - - ENV=${GUARDIAN_ENV} - - DIRECT_MESSAGE_PORT=6555 + - GUARDIAN_ENV=${GUARDIAN_ENV} expose: - 6555 + - 5005 api-gateway: env_file: - - ./api-gateway/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./api-gateway/Dockerfile @@ -137,32 +144,36 @@ services: - auth-service - logger-service environment: - - ENV=${GUARDIAN_ENV} - - DIRECT_MESSAGE_PORT=6555 + - GUARDIAN_ENV=${GUARDIAN_ENV} policy-service: env_file: - - ./policy-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./policy-service/Dockerfile + ports: + - "5006:5006" depends_on: - mongo - message-broker - auth-service - logger-service environment: - - ENV=${GUARDIAN_ENV} + - GUARDIAN_ENV=${GUARDIAN_ENV} expose: - 50000-60000 + - 5006 guardian-service: env_file: - - ./guardian-service/.env.docker + - ./configs/.env.${GUARDIAN_ENV}.guardian.system build: context: . dockerfile: ./guardian-service/Dockerfile + ports: + - "5007:5007" depends_on: - mongo - message-broker @@ -172,10 +183,10 @@ services: - worker-service-2 - policy-service environment: - - ENV=${GUARDIAN_ENV} - - DIRECT_MESSAGE_PORT=6555 + - GUARDIAN_ENV=${GUARDIAN_ENV} expose: - 6555 + - 5007 application-events: build: @@ -192,12 +203,16 @@ services: - auth-service - logger-service + mrv-sender: build: context: . dockerfile: ./mrv-sender/Dockerfile expose: - - 3005 + - 3003 + - 5008 + ports: + - "5008:5008" topic-viewer: build: @@ -205,6 +220,9 @@ services: dockerfile: ./topic-viewer/Dockerfile expose: - 3006 + - 5009 + ports: + - "5009:5009" web-proxy: build: @@ -219,9 +237,52 @@ services: - api-docs - mrv-sender - mongo-express + + prometheus: + image: prom/prometheus:latest + container_name: prometheus + restart: unless-stopped + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.console.libraries=/etc/prometheus/console_libraries' + - '--web.console.templates=/etc/prometheus/consoles' + - '--web.enable-lifecycle' + ports: + - "9090:9090" + networks: + - monitoring + + grafana: + image: grafana/grafana + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/provisioning:/etc/grafana/provisioning + - ./grafana/dashboards:/etc/grafana/dashboards + environment: + - GF_AUTH_DISABLE_LOGIN_FORM=true + - GF_AUTH_ANONYMOUS_ENABLED=true + - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin + - GF_SERVER_HTTP_PORT=9080 + - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/etc/grafana/dashboards/prometheus-dashboard.json + ports: + - "9080:9080" + networks: + - monitoring + volumes: mongo: + prometheus_data: {} + grafana_data: {} # volume-guardian-service: # volume-ui-service: # volume-mrv-sender: # volume-message-broker: + +networks: + monitoring: + driver: bridge diff --git a/docker-composeRIL.yml b/docker-composeRIL.yml new file mode 100644 index 0000000000..91084f54bf --- /dev/null +++ b/docker-composeRIL.yml @@ -0,0 +1,230 @@ +version: "3.8" +services: + mongo: + image: mongo:6.0.3 + command: "--setParameter allowDiskUseByDefault=true" + restart: always + expose: + - 27017 + ports: + - "27017:27017" + + mongo-express: + image: mongo-express:1.0.0-alpha.4 + expose: + - 8081 + environment: + ME_CONFIG_MONGODB_SERVER: mongo + ME_CONFIG_MONGODB_PORT: 27017 + ME_CONFIG_SITE_BASEURL: /mongo-admin + depends_on: + - mongo + + ipfs-node: + image: ipfs/kubo:v0.18.1 + ports: + - "5001:5001" + - "5002:5002" + - "4001:4001" + - "4002:4002" + - "8080:8080" + - "8081:8081" + volumes: + - ./runtime-data/ipfs/staging:/export:rw + - ./runtime-data/ipfs/data:/data/ipfs:rw + + api-docs: + build: + context: . + dockerfile: ./api-docs/Dockerfile + expose: + - 3001 + + message-broker: + image: nats:2.9.8 + expose: + - 4222 + ports: + - '8222:8222' + command: '--http_port 8222' + + vault: + image: vault:1.12.2 + expose: + - 8200 + ports: + - '8200:8200' + environment: + VAULT_SERVER: "http://0.0.0.0:8200" + VAULT_DEV_ROOT_TOKEN_ID: "1234" + cap_add: + - IPC_LOCK + volumes: + - ./file:/vault/file:rw + - ./config:/vault/config:rw + +# https://docs.docker.com/compose/environment-variables/envvars-precedence/ +# Environment leverage the gerarchy defined in the docker compose between "env_file" and "environment" attributes +# ecosystem variables defined in the "env_file" .env.${GUARDIAN_ENV}.guardian.system +# specific service variables defined by "environment" can override what is defined in the ecosystem file + + logger-service: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./logger-service/Dockerfile + depends_on: + - message-broker + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + + worker-service-1: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./worker-service/Dockerfile + depends_on: + - ipfs-node + - auth-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL:"worker.1" + expose: + - 6555 + + worker-service-2: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./worker-service/Dockerfile + depends_on: + - ipfs-node + - auth-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL="worker.2" + expose: + - 6555 + + auth-service: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./auth-service/Dockerfile + depends_on: + - mongo + - vault + - message-broker + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + expose: + - 6555 + + api-gateway: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./api-gateway/Dockerfile + expose: + - 3002 + - 6555 + depends_on: + - mongo + - message-broker + - guardian-service + - auth-service + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + + policy-service: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./policy-service/Dockerfile + depends_on: + - mongo + - message-broker + - auth-service + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + expose: + - 50000-60000 + + + guardian-service: + env_file: + - ./configs/.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./guardian-service/Dockerfile + depends_on: + - mongo + - message-broker + - auth-service + - logger-service + - worker-service-1 + - worker-service-2 + - policy-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + expose: + - 6555 + + # application-events: + # build: + # context: . + # dockerfile: application-events/Dockerfile + # expose: + # - 3012 + # ports: + # - "3012:3012" + # depends_on: + # - mongo + # - message-broker + # - guardian-service + # - auth-service + # - logger-service + + + mrv-sender: + build: + context: . + dockerfile: ./mrv-sender/Dockerfile + expose: + - 3005 + + topic-viewer: + build: + context: . + dockerfile: ./topic-viewer/Dockerfile + expose: + - 3006 + + web-proxy: + build: + context: . + dockerfile: ./web-proxy/Dockerfile + ports: + - "3000:80" + depends_on: + - guardian-service + - auth-service + - api-gateway + - api-docs + - mrv-sender + - mongo-express +volumes: + mongo: + # volume-guardian-service: + # volume-ui-service: + # volume-mrv-sender: + # volume-message-broker: diff --git a/docker-compose_SSV.yml b/docker-compose_SSV.yml new file mode 100644 index 0000000000..a58eeb7efb --- /dev/null +++ b/docker-compose_SSV.yml @@ -0,0 +1,216 @@ +version: "3.8" +services: + mongo: + image: mongo:6.0.3 + command: "--setParameter allowDiskUseByDefault=true" + restart: always + expose: + - 27017 + + mongo-express: + image: mongo-express:1.0.0-alpha.4 + expose: + - 8081 + environment: + ME_CONFIG_MONGODB_SERVER: mongo + ME_CONFIG_MONGODB_PORT: 27017 + ME_CONFIG_SITE_BASEURL: /mongo-admin + depends_on: + - mongo + + ipfs-node: + image: ipfs/kubo:v0.18.1 + ports: + - "5001:5001" + - "5002:5002" + - "4001:4001" + - "4002:4002" + - "8080:8080" + - "8081:8081" + volumes: + - ./runtime-data/ipfs/staging:/export:rw + - ./runtime-data/ipfs/data:/data/ipfs:rw + + api-docs: + build: + context: . + dockerfile: ./api-docs/Dockerfile + expose: + - 3001 + + message-broker: + image: nats:2.9.8 + expose: + - 4222 + ports: + - '8222:8222' + command: '--http_port 8222' + + vault: + image: vault:1.12.2 + expose: + - 8200 + ports: + - '8200:8200' + environment: + VAULT_SERVER: "http://0.0.0.0:8200" + VAULT_DEV_ROOT_TOKEN_ID: "1234" + cap_add: + - IPC_LOCK + volumes: + - ./file:/vault/file:rw + - ./config:/vault/config:rw + + +# https://docs.docker.com/compose/environment-variables/envvars-precedence/ +# Environment leverage the gerarchy defined in the docker compose between "env_file" and "environment" attributes +# ecosystem variables defined in the "env_file" .env.${GUARDIAN_ENV}.guardian.system +# specific service variables defined by "environment" can override what is defined in the ecosystem file + + logger-service: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./logger-service/Dockerfile + depends_on: + - message-broker + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${LOGGER_SERVICE_CHANNEL} + - DB_DATABASE=${LOGGER_DB_DATABASE} + + auth-service: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./auth-service/Dockerfile + depends_on: + - mongo + - vault + - message-broker + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${AUTH_SERVICE_CHANNEL} + - DB_DATABASE=${AUTH_DB_DATABASE} + + worker-service-1: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./worker-service/Dockerfile + depends_on: + - ipfs-node + - auth-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${WORKER_1_SERVICE_CHANNEL} + + worker-service-2: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./worker-service/Dockerfile + depends_on: + - ipfs-node + - auth-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${WORKER_2_SERVICE_CHANNEL} + + api-gateway: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./api-gateway/Dockerfile + expose: + - 3002 + depends_on: + - mongo + - message-broker + - guardian-service + - auth-service + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${API_SERVICE_CHANNEL} + + + policy-service: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./policy-service/Dockerfile + depends_on: + - mongo + - message-broker + - auth-service + - logger-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${POLICY_SERVICE_CHANNEL} + - DB_DATABASE=${POLICY_DB_DATABASE} + - LOG_LEVEL=${POLICY_LOG_LEVEL} + - MULTI_POLICY_SCHEDULER=${POLICY_MULTI_POLICY_SCHEDULER} + - EXTERNAL_DOCUMENTS_SCHEDULER=${EXTERNAL_DOCUMENTS_SCHEDULER} + + guardian-service: + env_file: + - ./.env.${GUARDIAN_ENV}.guardian.system + build: + context: . + dockerfile: ./guardian-service/Dockerfile + depends_on: + - mongo + - message-broker + - auth-service + - logger-service + - worker-service-1 + - worker-service-2 + - policy-service + environment: + - GUARDIAN_ENV=${GUARDIAN_ENV} + - SERVICE_CHANNEL=${GUARDIAN_SERVICE_CHANNEL} + - DB_DATABASE=${GUARDIAN_DB_DATABASE} + - LOG_LEVEL=${GUARDIAN_LOG_LEVEL} + - MULTI_POLICY_SCHEDULER=${GUARDIAN_MULTI_POLICY_SCHEDULER} + + mrv-sender: + build: + context: . + dockerfile: ./mrv-sender/Dockerfile + expose: + - 3005 + + topic-viewer: + build: + context: . + dockerfile: ./topic-viewer/Dockerfile + expose: + - 3006 + + web-proxy: + build: + context: . + dockerfile: ./web-proxy/Dockerfile + ports: + - "3000:80" + depends_on: + - guardian-service + - auth-service + - api-gateway + - api-docs + - mrv-sender + - mongo-express +volumes: + mongo: + # volume-guardian-service: + # volume-ui-service: + # volume-mrv-sender: + # volume-message-broker: diff --git a/docs/.gitbook/assets/0 (5) (1).png b/docs/.gitbook/assets/0 (5) (1).png new file mode 100644 index 0000000000..268e7cfb7c Binary files /dev/null and b/docs/.gitbook/assets/0 (5) (1).png differ diff --git a/docs/.gitbook/assets/0 (5).png b/docs/.gitbook/assets/0 (5).png index 268e7cfb7c..981c952d33 100644 Binary files a/docs/.gitbook/assets/0 (5).png and b/docs/.gitbook/assets/0 (5).png differ diff --git a/docs/.gitbook/assets/1 (1) (3) (1).png b/docs/.gitbook/assets/1 (1) (3) (1).png new file mode 100644 index 0000000000..18283aeb35 Binary files /dev/null and b/docs/.gitbook/assets/1 (1) (3) (1).png differ diff --git a/docs/.gitbook/assets/1 (1) (4).png b/docs/.gitbook/assets/1 (1) (4).png new file mode 100644 index 0000000000..dd669d36a9 Binary files /dev/null and b/docs/.gitbook/assets/1 (1) (4).png differ diff --git a/docs/.gitbook/assets/1 (1).png b/docs/.gitbook/assets/1 (1).png index dd669d36a9..8d55585495 100644 Binary files a/docs/.gitbook/assets/1 (1).png and b/docs/.gitbook/assets/1 (1).png differ diff --git a/docs/.gitbook/assets/20 (1) (1) (1) (1).png b/docs/.gitbook/assets/20 (1) (1) (1) (1).png new file mode 100644 index 0000000000..bef966dff8 Binary files /dev/null and b/docs/.gitbook/assets/20 (1) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/20 (1) (1) (1).png b/docs/.gitbook/assets/20 (1) (1) (1).png new file mode 100644 index 0000000000..bef966dff8 Binary files /dev/null and b/docs/.gitbook/assets/20 (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/20 (1) (3) (1) (1).png b/docs/.gitbook/assets/20 (1) (3) (1) (1).png new file mode 100644 index 0000000000..a285cca3a4 Binary files /dev/null and b/docs/.gitbook/assets/20 (1) (3) (1) (1).png differ diff --git a/docs/.gitbook/assets/20 (1) (3) (1).png b/docs/.gitbook/assets/20 (1) (3) (1).png new file mode 100644 index 0000000000..a285cca3a4 Binary files /dev/null and b/docs/.gitbook/assets/20 (1) (3) (1).png differ diff --git a/docs/.gitbook/assets/220951740-45a57b4f-71f3-4c3f-ada9-1496c3e23535.png b/docs/.gitbook/assets/220951740-45a57b4f-71f3-4c3f-ada9-1496c3e23535.png new file mode 100644 index 0000000000..40987ba4f9 Binary files /dev/null and b/docs/.gitbook/assets/220951740-45a57b4f-71f3-4c3f-ada9-1496c3e23535.png differ diff --git a/docs/.gitbook/assets/4 (1) (1) (2) (1) (1).png b/docs/.gitbook/assets/4 (1) (1) (2) (1) (1).png new file mode 100644 index 0000000000..39080d4bba Binary files /dev/null and b/docs/.gitbook/assets/4 (1) (1) (2) (1) (1).png differ diff --git a/docs/.gitbook/assets/4 (1) (1) (2) (1).png b/docs/.gitbook/assets/4 (1) (1) (2) (1).png new file mode 100644 index 0000000000..3e35cf3ea1 Binary files /dev/null and b/docs/.gitbook/assets/4 (1) (1) (2) (1).png differ diff --git a/docs/.gitbook/assets/4 (1) (1) (2).png b/docs/.gitbook/assets/4 (1) (1) (2).png index 39080d4bba..3e35cf3ea1 100644 Binary files a/docs/.gitbook/assets/4 (1) (1) (2).png and b/docs/.gitbook/assets/4 (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/4 (1) (4).png b/docs/.gitbook/assets/4 (1) (4).png new file mode 100644 index 0000000000..3e35cf3ea1 Binary files /dev/null and b/docs/.gitbook/assets/4 (1) (4).png differ diff --git a/docs/.gitbook/assets/9 (1) (3) (1) (1).png b/docs/.gitbook/assets/9 (1) (3) (1) (1).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (3) (1) (1).png differ diff --git a/docs/.gitbook/assets/9 (1) (3) (1) (2).png b/docs/.gitbook/assets/9 (1) (3) (1) (2).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (3) (1) (2).png differ diff --git a/docs/.gitbook/assets/9 (1) (3) (1).png b/docs/.gitbook/assets/9 (1) (3) (1).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (3) (1).png differ diff --git a/docs/.gitbook/assets/9 (1) (3) (2).png b/docs/.gitbook/assets/9 (1) (3) (2).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (3) (2).png differ diff --git a/docs/.gitbook/assets/9 (1) (4) (1).png b/docs/.gitbook/assets/9 (1) (4) (1).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (4) (1).png differ diff --git a/docs/.gitbook/assets/9 (1) (4) (2).png b/docs/.gitbook/assets/9 (1) (4) (2).png new file mode 100644 index 0000000000..40f083816e Binary files /dev/null and b/docs/.gitbook/assets/9 (1) (4) (2).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (1).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (1).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (1).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png differ diff --git a/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (3).png b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (3).png new file mode 100644 index 0000000000..9f1a84da4d Binary files /dev/null and b/docs/.gitbook/assets/API_10 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (3).png differ diff --git a/docs/.gitbook/assets/image (1) (1) (2) (1).png b/docs/.gitbook/assets/image (1) (1) (2) (1).png new file mode 100644 index 0000000000..d8af307b2f Binary files /dev/null and b/docs/.gitbook/assets/image (1) (1) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (1) (1) (2).png b/docs/.gitbook/assets/image (1) (1) (2).png index d8af307b2f..960a400745 100644 Binary files a/docs/.gitbook/assets/image (1) (1) (2).png and b/docs/.gitbook/assets/image (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (1) (1) (5).png b/docs/.gitbook/assets/image (1) (1) (5).png new file mode 100644 index 0000000000..6902527d96 Binary files /dev/null and b/docs/.gitbook/assets/image (1) (1) (5).png differ diff --git a/docs/.gitbook/assets/image (1) (1).png b/docs/.gitbook/assets/image (1) (1).png index 6902527d96..0a2d6fbf1a 100644 Binary files a/docs/.gitbook/assets/image (1) (1).png and b/docs/.gitbook/assets/image (1) (1).png differ diff --git a/docs/.gitbook/assets/image (1) (10).png b/docs/.gitbook/assets/image (1) (10).png new file mode 100644 index 0000000000..fdcf70a605 Binary files /dev/null and b/docs/.gitbook/assets/image (1) (10).png differ diff --git a/docs/.gitbook/assets/image (1).png b/docs/.gitbook/assets/image (1).png index fdcf70a605..00f5f84117 100644 Binary files a/docs/.gitbook/assets/image (1).png and b/docs/.gitbook/assets/image (1).png differ diff --git a/docs/.gitbook/assets/image (10) (4).png b/docs/.gitbook/assets/image (10) (4).png new file mode 100644 index 0000000000..93de69b997 Binary files /dev/null and b/docs/.gitbook/assets/image (10) (4).png differ diff --git a/docs/.gitbook/assets/image (10).png b/docs/.gitbook/assets/image (10).png index 93de69b997..e01e3c3ec1 100644 Binary files a/docs/.gitbook/assets/image (10).png and b/docs/.gitbook/assets/image (10).png differ diff --git a/docs/.gitbook/assets/image (100).png b/docs/.gitbook/assets/image (100).png new file mode 100644 index 0000000000..21da78d678 Binary files /dev/null and b/docs/.gitbook/assets/image (100).png differ diff --git a/docs/.gitbook/assets/image (101) (1).png b/docs/.gitbook/assets/image (101) (1).png new file mode 100644 index 0000000000..61cee398b1 Binary files /dev/null and b/docs/.gitbook/assets/image (101) (1).png differ diff --git a/docs/.gitbook/assets/image (101).png b/docs/.gitbook/assets/image (101).png new file mode 100644 index 0000000000..61cee398b1 Binary files /dev/null and b/docs/.gitbook/assets/image (101).png differ diff --git a/docs/.gitbook/assets/image (102).png b/docs/.gitbook/assets/image (102).png new file mode 100644 index 0000000000..c2adab8c06 Binary files /dev/null and b/docs/.gitbook/assets/image (102).png differ diff --git a/docs/.gitbook/assets/image (103).png b/docs/.gitbook/assets/image (103).png new file mode 100644 index 0000000000..ac6e6593b1 Binary files /dev/null and b/docs/.gitbook/assets/image (103).png differ diff --git a/docs/.gitbook/assets/image (104).png b/docs/.gitbook/assets/image (104).png new file mode 100644 index 0000000000..4413da47be Binary files /dev/null and b/docs/.gitbook/assets/image (104).png differ diff --git a/docs/.gitbook/assets/image (105).png b/docs/.gitbook/assets/image (105).png new file mode 100644 index 0000000000..c447b08824 Binary files /dev/null and b/docs/.gitbook/assets/image (105).png differ diff --git a/docs/.gitbook/assets/image (106).png b/docs/.gitbook/assets/image (106).png new file mode 100644 index 0000000000..617243057e Binary files /dev/null and b/docs/.gitbook/assets/image (106).png differ diff --git a/docs/.gitbook/assets/image (107).png b/docs/.gitbook/assets/image (107).png new file mode 100644 index 0000000000..752eb6f324 Binary files /dev/null and b/docs/.gitbook/assets/image (107).png differ diff --git a/docs/.gitbook/assets/image (108).png b/docs/.gitbook/assets/image (108).png new file mode 100644 index 0000000000..eff05c4f0a Binary files /dev/null and b/docs/.gitbook/assets/image (108).png differ diff --git a/docs/.gitbook/assets/image (109).png b/docs/.gitbook/assets/image (109).png new file mode 100644 index 0000000000..16800ecf22 Binary files /dev/null and b/docs/.gitbook/assets/image (109).png differ diff --git a/docs/.gitbook/assets/image (11) (1) (1) (1) (1).png b/docs/.gitbook/assets/image (11) (1) (1) (1) (1).png new file mode 100644 index 0000000000..19019ed11a Binary files /dev/null and b/docs/.gitbook/assets/image (11) (1) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (11) (1) (1) (1).png b/docs/.gitbook/assets/image (11) (1) (1) (1).png new file mode 100644 index 0000000000..19019ed11a Binary files /dev/null and b/docs/.gitbook/assets/image (11) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (11) (1) (1).png b/docs/.gitbook/assets/image (11) (1) (1).png index 19019ed11a..787f7ce1e3 100644 Binary files a/docs/.gitbook/assets/image (11) (1) (1).png and b/docs/.gitbook/assets/image (11) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (11) (1) (2).png b/docs/.gitbook/assets/image (11) (1) (2).png index 19019ed11a..7678f89aa8 100644 Binary files a/docs/.gitbook/assets/image (11) (1) (2).png and b/docs/.gitbook/assets/image (11) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (11) (1).png b/docs/.gitbook/assets/image (11) (1).png index 787f7ce1e3..13f4711ac7 100644 Binary files a/docs/.gitbook/assets/image (11) (1).png and b/docs/.gitbook/assets/image (11) (1).png differ diff --git a/docs/.gitbook/assets/image (11) (3) (1).png b/docs/.gitbook/assets/image (11) (3) (1).png new file mode 100644 index 0000000000..9967595c21 Binary files /dev/null and b/docs/.gitbook/assets/image (11) (3) (1).png differ diff --git a/docs/.gitbook/assets/image (11) (3).png b/docs/.gitbook/assets/image (11) (3).png new file mode 100644 index 0000000000..8cf4a0c1f7 Binary files /dev/null and b/docs/.gitbook/assets/image (11) (3).png differ diff --git a/docs/.gitbook/assets/image (11).png b/docs/.gitbook/assets/image (11).png index 9967595c21..9b48a4c757 100644 Binary files a/docs/.gitbook/assets/image (11).png and b/docs/.gitbook/assets/image (11).png differ diff --git a/docs/.gitbook/assets/image (110).png b/docs/.gitbook/assets/image (110).png new file mode 100644 index 0000000000..cc31d0d701 Binary files /dev/null and b/docs/.gitbook/assets/image (110).png differ diff --git a/docs/.gitbook/assets/image (111).png b/docs/.gitbook/assets/image (111).png new file mode 100644 index 0000000000..e10048747c Binary files /dev/null and b/docs/.gitbook/assets/image (111).png differ diff --git a/docs/.gitbook/assets/image (112).png b/docs/.gitbook/assets/image (112).png new file mode 100644 index 0000000000..32514b5641 Binary files /dev/null and b/docs/.gitbook/assets/image (112).png differ diff --git a/docs/.gitbook/assets/image (12) (5).png b/docs/.gitbook/assets/image (12) (5).png new file mode 100644 index 0000000000..303850328f Binary files /dev/null and b/docs/.gitbook/assets/image (12) (5).png differ diff --git a/docs/.gitbook/assets/image (12).png b/docs/.gitbook/assets/image (12).png index 303850328f..7e161ae7be 100644 Binary files a/docs/.gitbook/assets/image (12).png and b/docs/.gitbook/assets/image (12).png differ diff --git a/docs/.gitbook/assets/image (13) (1) (1) (1).png b/docs/.gitbook/assets/image (13) (1) (1) (1).png new file mode 100644 index 0000000000..9192379a75 Binary files /dev/null and b/docs/.gitbook/assets/image (13) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (13) (1) (1) (2).png b/docs/.gitbook/assets/image (13) (1) (1) (2).png new file mode 100644 index 0000000000..3e92f1dbdb Binary files /dev/null and b/docs/.gitbook/assets/image (13) (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (13) (1) (1).png b/docs/.gitbook/assets/image (13) (1) (1).png index 9192379a75..889345de7c 100644 Binary files a/docs/.gitbook/assets/image (13) (1) (1).png and b/docs/.gitbook/assets/image (13) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (13) (1).png b/docs/.gitbook/assets/image (13) (1).png index 3e92f1dbdb..0cddb8a093 100644 Binary files a/docs/.gitbook/assets/image (13) (1).png and b/docs/.gitbook/assets/image (13) (1).png differ diff --git a/docs/.gitbook/assets/image (13) (5).png b/docs/.gitbook/assets/image (13) (5).png new file mode 100644 index 0000000000..5de97963e8 Binary files /dev/null and b/docs/.gitbook/assets/image (13) (5).png differ diff --git a/docs/.gitbook/assets/image (13).png b/docs/.gitbook/assets/image (13).png index 5de97963e8..cba1bfe46f 100644 Binary files a/docs/.gitbook/assets/image (13).png and b/docs/.gitbook/assets/image (13).png differ diff --git a/docs/.gitbook/assets/image (14) (4).png b/docs/.gitbook/assets/image (14) (4).png new file mode 100644 index 0000000000..83a0615acf Binary files /dev/null and b/docs/.gitbook/assets/image (14) (4).png differ diff --git a/docs/.gitbook/assets/image (14) (5).png b/docs/.gitbook/assets/image (14) (5).png new file mode 100644 index 0000000000..beb445db85 Binary files /dev/null and b/docs/.gitbook/assets/image (14) (5).png differ diff --git a/docs/.gitbook/assets/image (14).png b/docs/.gitbook/assets/image (14).png index 83a0615acf..89a1a786d5 100644 Binary files a/docs/.gitbook/assets/image (14).png and b/docs/.gitbook/assets/image (14).png differ diff --git a/docs/.gitbook/assets/image (15) (4).png b/docs/.gitbook/assets/image (15) (4).png new file mode 100644 index 0000000000..6c274aedd7 Binary files /dev/null and b/docs/.gitbook/assets/image (15) (4).png differ diff --git a/docs/.gitbook/assets/image (15).png b/docs/.gitbook/assets/image (15).png index 6c274aedd7..dc3ba15099 100644 Binary files a/docs/.gitbook/assets/image (15).png and b/docs/.gitbook/assets/image (15).png differ diff --git a/docs/.gitbook/assets/image (16) (1) (1).png b/docs/.gitbook/assets/image (16) (1) (1).png new file mode 100644 index 0000000000..a507d3825d Binary files /dev/null and b/docs/.gitbook/assets/image (16) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (16) (1) (2).png b/docs/.gitbook/assets/image (16) (1) (2).png new file mode 100644 index 0000000000..3d3f639659 Binary files /dev/null and b/docs/.gitbook/assets/image (16) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (16) (1).png b/docs/.gitbook/assets/image (16) (1).png index a507d3825d..a58d81b67f 100644 Binary files a/docs/.gitbook/assets/image (16) (1).png and b/docs/.gitbook/assets/image (16) (1).png differ diff --git a/docs/.gitbook/assets/image (16) (3) (2).png b/docs/.gitbook/assets/image (16) (3) (2).png new file mode 100644 index 0000000000..13eea5a6ff Binary files /dev/null and b/docs/.gitbook/assets/image (16) (3) (2).png differ diff --git a/docs/.gitbook/assets/image (16) (3).png b/docs/.gitbook/assets/image (16) (3).png index 13eea5a6ff..d86413567d 100644 Binary files a/docs/.gitbook/assets/image (16) (3).png and b/docs/.gitbook/assets/image (16) (3).png differ diff --git a/docs/.gitbook/assets/image (16) (5).png b/docs/.gitbook/assets/image (16) (5).png new file mode 100644 index 0000000000..a1bad77e3d Binary files /dev/null and b/docs/.gitbook/assets/image (16) (5).png differ diff --git a/docs/.gitbook/assets/image (16).png b/docs/.gitbook/assets/image (16).png index a1bad77e3d..18a0506693 100644 Binary files a/docs/.gitbook/assets/image (16).png and b/docs/.gitbook/assets/image (16).png differ diff --git a/docs/.gitbook/assets/image (17) (2) (1).png b/docs/.gitbook/assets/image (17) (2) (1).png new file mode 100644 index 0000000000..834d249420 Binary files /dev/null and b/docs/.gitbook/assets/image (17) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (17) (2).png b/docs/.gitbook/assets/image (17) (2).png index 834d249420..286822b859 100644 Binary files a/docs/.gitbook/assets/image (17) (2).png and b/docs/.gitbook/assets/image (17) (2).png differ diff --git a/docs/.gitbook/assets/image (17) (4).png b/docs/.gitbook/assets/image (17) (4).png new file mode 100644 index 0000000000..0c8c56ff1f Binary files /dev/null and b/docs/.gitbook/assets/image (17) (4).png differ diff --git a/docs/.gitbook/assets/image (17).png b/docs/.gitbook/assets/image (17).png index 0c8c56ff1f..ab67751035 100644 Binary files a/docs/.gitbook/assets/image (17).png and b/docs/.gitbook/assets/image (17).png differ diff --git a/docs/.gitbook/assets/image (18) (5).png b/docs/.gitbook/assets/image (18) (5).png new file mode 100644 index 0000000000..6261b08fac Binary files /dev/null and b/docs/.gitbook/assets/image (18) (5).png differ diff --git a/docs/.gitbook/assets/image (18).png b/docs/.gitbook/assets/image (18).png index 6261b08fac..eb67c11d8b 100644 Binary files a/docs/.gitbook/assets/image (18).png and b/docs/.gitbook/assets/image (18).png differ diff --git a/docs/.gitbook/assets/image (19) (5).png b/docs/.gitbook/assets/image (19) (5).png new file mode 100644 index 0000000000..8e79871b54 Binary files /dev/null and b/docs/.gitbook/assets/image (19) (5).png differ diff --git a/docs/.gitbook/assets/image (19).png b/docs/.gitbook/assets/image (19).png index 8e79871b54..886dbb0eba 100644 Binary files a/docs/.gitbook/assets/image (19).png and b/docs/.gitbook/assets/image (19).png differ diff --git a/docs/.gitbook/assets/image (2) (1) (4).png b/docs/.gitbook/assets/image (2) (1) (4).png new file mode 100644 index 0000000000..e98d0cb708 Binary files /dev/null and b/docs/.gitbook/assets/image (2) (1) (4).png differ diff --git a/docs/.gitbook/assets/image (2) (1) (5).png b/docs/.gitbook/assets/image (2) (1) (5).png new file mode 100644 index 0000000000..458d95b1fd Binary files /dev/null and b/docs/.gitbook/assets/image (2) (1) (5).png differ diff --git a/docs/.gitbook/assets/image (2) (1) (6).png b/docs/.gitbook/assets/image (2) (1) (6).png new file mode 100644 index 0000000000..8e4bfd6e1b Binary files /dev/null and b/docs/.gitbook/assets/image (2) (1) (6).png differ diff --git a/docs/.gitbook/assets/image (2) (1).png b/docs/.gitbook/assets/image (2) (1).png index e98d0cb708..c3d8ec6e92 100644 Binary files a/docs/.gitbook/assets/image (2) (1).png and b/docs/.gitbook/assets/image (2) (1).png differ diff --git a/docs/.gitbook/assets/image (2) (2) (1) (1).png b/docs/.gitbook/assets/image (2) (2) (1) (1).png new file mode 100644 index 0000000000..07eddc8c0e Binary files /dev/null and b/docs/.gitbook/assets/image (2) (2) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (2) (9).png b/docs/.gitbook/assets/image (2) (9).png new file mode 100644 index 0000000000..04ed31344e Binary files /dev/null and b/docs/.gitbook/assets/image (2) (9).png differ diff --git a/docs/.gitbook/assets/image (2).png b/docs/.gitbook/assets/image (2).png index 04ed31344e..dc23e95ce2 100644 Binary files a/docs/.gitbook/assets/image (2).png and b/docs/.gitbook/assets/image (2).png differ diff --git a/docs/.gitbook/assets/image (20) (2) (1) (1).png b/docs/.gitbook/assets/image (20) (2) (1) (1).png new file mode 100644 index 0000000000..4251798577 Binary files /dev/null and b/docs/.gitbook/assets/image (20) (2) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (20) (2) (1).png b/docs/.gitbook/assets/image (20) (2) (1).png new file mode 100644 index 0000000000..4251798577 Binary files /dev/null and b/docs/.gitbook/assets/image (20) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (20) (2).png b/docs/.gitbook/assets/image (20) (2).png index 4251798577..b1fdc88123 100644 Binary files a/docs/.gitbook/assets/image (20) (2).png and b/docs/.gitbook/assets/image (20) (2).png differ diff --git a/docs/.gitbook/assets/image (20).png b/docs/.gitbook/assets/image (20).png index b1fdc88123..25cc6cfb8c 100644 Binary files a/docs/.gitbook/assets/image (20).png and b/docs/.gitbook/assets/image (20).png differ diff --git a/docs/.gitbook/assets/image (21) (1) (1).png b/docs/.gitbook/assets/image (21) (1) (1).png new file mode 100644 index 0000000000..8af8beafdd Binary files /dev/null and b/docs/.gitbook/assets/image (21) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (21) (1).png b/docs/.gitbook/assets/image (21) (1).png index 8af8beafdd..bae1670849 100644 Binary files a/docs/.gitbook/assets/image (21) (1).png and b/docs/.gitbook/assets/image (21) (1).png differ diff --git a/docs/.gitbook/assets/image (21).png b/docs/.gitbook/assets/image (21).png index bae1670849..d2778826fc 100644 Binary files a/docs/.gitbook/assets/image (21).png and b/docs/.gitbook/assets/image (21).png differ diff --git a/docs/.gitbook/assets/image (22) (4).png b/docs/.gitbook/assets/image (22) (4).png new file mode 100644 index 0000000000..7eef7bc3bb Binary files /dev/null and b/docs/.gitbook/assets/image (22) (4).png differ diff --git a/docs/.gitbook/assets/image (22).png b/docs/.gitbook/assets/image (22).png index 7eef7bc3bb..7df27981d8 100644 Binary files a/docs/.gitbook/assets/image (22).png and b/docs/.gitbook/assets/image (22).png differ diff --git a/docs/.gitbook/assets/image (23) (6).png b/docs/.gitbook/assets/image (23) (6).png new file mode 100644 index 0000000000..b74867b405 Binary files /dev/null and b/docs/.gitbook/assets/image (23) (6).png differ diff --git a/docs/.gitbook/assets/image (23).png b/docs/.gitbook/assets/image (23).png index b74867b405..488fa9501d 100644 Binary files a/docs/.gitbook/assets/image (23).png and b/docs/.gitbook/assets/image (23).png differ diff --git a/docs/.gitbook/assets/image (24) (2) (1).png b/docs/.gitbook/assets/image (24) (2) (1).png new file mode 100644 index 0000000000..5559c36c54 Binary files /dev/null and b/docs/.gitbook/assets/image (24) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (24) (2) (2).png b/docs/.gitbook/assets/image (24) (2) (2).png new file mode 100644 index 0000000000..18f8ae8509 Binary files /dev/null and b/docs/.gitbook/assets/image (24) (2) (2).png differ diff --git a/docs/.gitbook/assets/image (24) (2).png b/docs/.gitbook/assets/image (24) (2).png index 5559c36c54..57ad475c2b 100644 Binary files a/docs/.gitbook/assets/image (24) (2).png and b/docs/.gitbook/assets/image (24) (2).png differ diff --git a/docs/.gitbook/assets/image (24).png b/docs/.gitbook/assets/image (24).png index 18f8ae8509..de1f2d06c1 100644 Binary files a/docs/.gitbook/assets/image (24).png and b/docs/.gitbook/assets/image (24).png differ diff --git a/docs/.gitbook/assets/image (25) (2) (1).png b/docs/.gitbook/assets/image (25) (2) (1).png new file mode 100644 index 0000000000..30b8373ea4 Binary files /dev/null and b/docs/.gitbook/assets/image (25) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (25) (2).png b/docs/.gitbook/assets/image (25) (2).png index 30b8373ea4..8c9f3aa61c 100644 Binary files a/docs/.gitbook/assets/image (25) (2).png and b/docs/.gitbook/assets/image (25) (2).png differ diff --git a/docs/.gitbook/assets/image (25) (3).png b/docs/.gitbook/assets/image (25) (3).png new file mode 100644 index 0000000000..7d61f0975b Binary files /dev/null and b/docs/.gitbook/assets/image (25) (3).png differ diff --git a/docs/.gitbook/assets/image (25).png b/docs/.gitbook/assets/image (25).png index 8c9f3aa61c..9ff3784bb8 100644 Binary files a/docs/.gitbook/assets/image (25).png and b/docs/.gitbook/assets/image (25).png differ diff --git a/docs/.gitbook/assets/image (26) (2).png b/docs/.gitbook/assets/image (26) (2).png new file mode 100644 index 0000000000..9f898a81a9 Binary files /dev/null and b/docs/.gitbook/assets/image (26) (2).png differ diff --git a/docs/.gitbook/assets/image (26).png b/docs/.gitbook/assets/image (26).png index 9f898a81a9..4d4fb8af5c 100644 Binary files a/docs/.gitbook/assets/image (26).png and b/docs/.gitbook/assets/image (26).png differ diff --git a/docs/.gitbook/assets/image (27) (1) (1) (1).png b/docs/.gitbook/assets/image (27) (1) (1) (1).png new file mode 100644 index 0000000000..ade9ae13a4 Binary files /dev/null and b/docs/.gitbook/assets/image (27) (1) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (27) (1) (1).png b/docs/.gitbook/assets/image (27) (1) (1).png new file mode 100644 index 0000000000..ade9ae13a4 Binary files /dev/null and b/docs/.gitbook/assets/image (27) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (27) (1).png b/docs/.gitbook/assets/image (27) (1).png index ade9ae13a4..7f50aec6fc 100644 Binary files a/docs/.gitbook/assets/image (27) (1).png and b/docs/.gitbook/assets/image (27) (1).png differ diff --git a/docs/.gitbook/assets/image (27) (2).png b/docs/.gitbook/assets/image (27) (2).png new file mode 100644 index 0000000000..d7341b2c91 Binary files /dev/null and b/docs/.gitbook/assets/image (27) (2).png differ diff --git a/docs/.gitbook/assets/image (27).png b/docs/.gitbook/assets/image (27).png index d7341b2c91..c838548471 100644 Binary files a/docs/.gitbook/assets/image (27).png and b/docs/.gitbook/assets/image (27).png differ diff --git a/docs/.gitbook/assets/image (28) (2) (1).png b/docs/.gitbook/assets/image (28) (2) (1).png new file mode 100644 index 0000000000..a7be2db5b3 Binary files /dev/null and b/docs/.gitbook/assets/image (28) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (28) (2).png b/docs/.gitbook/assets/image (28) (2).png new file mode 100644 index 0000000000..67e410dd45 Binary files /dev/null and b/docs/.gitbook/assets/image (28) (2).png differ diff --git a/docs/.gitbook/assets/image (28).png b/docs/.gitbook/assets/image (28).png index a7be2db5b3..c3a7d81fe8 100644 Binary files a/docs/.gitbook/assets/image (28).png and b/docs/.gitbook/assets/image (28).png differ diff --git a/docs/.gitbook/assets/image (29) (5).png b/docs/.gitbook/assets/image (29) (5).png new file mode 100644 index 0000000000..3612f18e6f Binary files /dev/null and b/docs/.gitbook/assets/image (29) (5).png differ diff --git a/docs/.gitbook/assets/image (29).png b/docs/.gitbook/assets/image (29).png index 3612f18e6f..4797be9e9d 100644 Binary files a/docs/.gitbook/assets/image (29).png and b/docs/.gitbook/assets/image (29).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (1) (2).png b/docs/.gitbook/assets/image (3) (1) (1) (2).png new file mode 100644 index 0000000000..2a3c5595f9 Binary files /dev/null and b/docs/.gitbook/assets/image (3) (1) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (1).png b/docs/.gitbook/assets/image (3) (1) (1).png index 2a3c5595f9..9f58aa0fd7 100644 Binary files a/docs/.gitbook/assets/image (3) (1) (1).png and b/docs/.gitbook/assets/image (3) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (2) (2).png b/docs/.gitbook/assets/image (3) (1) (2) (2).png new file mode 100644 index 0000000000..ecebc76904 Binary files /dev/null and b/docs/.gitbook/assets/image (3) (1) (2) (2).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (2).png b/docs/.gitbook/assets/image (3) (1) (2).png index ecebc76904..c77d485565 100644 Binary files a/docs/.gitbook/assets/image (3) (1) (2).png and b/docs/.gitbook/assets/image (3) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (4) (1).png b/docs/.gitbook/assets/image (3) (1) (4) (1).png new file mode 100644 index 0000000000..d091e670f4 Binary files /dev/null and b/docs/.gitbook/assets/image (3) (1) (4) (1).png differ diff --git a/docs/.gitbook/assets/image (3) (1) (4).png b/docs/.gitbook/assets/image (3) (1) (4).png index d091e670f4..69ca4f14d3 100644 Binary files a/docs/.gitbook/assets/image (3) (1) (4).png and b/docs/.gitbook/assets/image (3) (1) (4).png differ diff --git a/docs/.gitbook/assets/image (3) (1).png b/docs/.gitbook/assets/image (3) (1).png index 9f58aa0fd7..875663673a 100644 Binary files a/docs/.gitbook/assets/image (3) (1).png and b/docs/.gitbook/assets/image (3) (1).png differ diff --git a/docs/.gitbook/assets/image (3) (4) (1).png b/docs/.gitbook/assets/image (3) (4) (1).png new file mode 100644 index 0000000000..914be531e5 Binary files /dev/null and b/docs/.gitbook/assets/image (3) (4) (1).png differ diff --git a/docs/.gitbook/assets/image (3) (4).png b/docs/.gitbook/assets/image (3) (4).png index 914be531e5..04ed31344e 100644 Binary files a/docs/.gitbook/assets/image (3) (4).png and b/docs/.gitbook/assets/image (3) (4).png differ diff --git a/docs/.gitbook/assets/image (3).png b/docs/.gitbook/assets/image (3).png index 04ed31344e..eb9d0405fb 100644 Binary files a/docs/.gitbook/assets/image (3).png and b/docs/.gitbook/assets/image (3).png differ diff --git a/docs/.gitbook/assets/image (30) (2).png b/docs/.gitbook/assets/image (30) (2).png new file mode 100644 index 0000000000..661f4c7b52 Binary files /dev/null and b/docs/.gitbook/assets/image (30) (2).png differ diff --git a/docs/.gitbook/assets/image (30).png b/docs/.gitbook/assets/image (30).png index 661f4c7b52..974e840a29 100644 Binary files a/docs/.gitbook/assets/image (30).png and b/docs/.gitbook/assets/image (30).png differ diff --git a/docs/.gitbook/assets/image (31) (1) (2) (1).png b/docs/.gitbook/assets/image (31) (1) (2) (1).png new file mode 100644 index 0000000000..90c87a335c Binary files /dev/null and b/docs/.gitbook/assets/image (31) (1) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (31) (1) (2).png b/docs/.gitbook/assets/image (31) (1) (2).png index 90c87a335c..791d8fbf8b 100644 Binary files a/docs/.gitbook/assets/image (31) (1) (2).png and b/docs/.gitbook/assets/image (31) (1) (2).png differ diff --git a/docs/.gitbook/assets/image (31) (1).png b/docs/.gitbook/assets/image (31) (1).png index 791d8fbf8b..b6411ef742 100644 Binary files a/docs/.gitbook/assets/image (31) (1).png and b/docs/.gitbook/assets/image (31) (1).png differ diff --git a/docs/.gitbook/assets/image (31) (2) (1).png b/docs/.gitbook/assets/image (31) (2) (1).png new file mode 100644 index 0000000000..2b04d0a172 Binary files /dev/null and b/docs/.gitbook/assets/image (31) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (31) (3).png b/docs/.gitbook/assets/image (31) (3).png new file mode 100644 index 0000000000..dbf8008663 Binary files /dev/null and b/docs/.gitbook/assets/image (31) (3).png differ diff --git a/docs/.gitbook/assets/image (31).png b/docs/.gitbook/assets/image (31).png index dbf8008663..9914e0ef60 100644 Binary files a/docs/.gitbook/assets/image (31).png and b/docs/.gitbook/assets/image (31).png differ diff --git a/docs/.gitbook/assets/image (32) (1) (1).png b/docs/.gitbook/assets/image (32) (1) (1).png new file mode 100644 index 0000000000..864182ffac Binary files /dev/null and b/docs/.gitbook/assets/image (32) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (32) (1).png b/docs/.gitbook/assets/image (32) (1).png index 864182ffac..dc1ddfd4bf 100644 Binary files a/docs/.gitbook/assets/image (32) (1).png and b/docs/.gitbook/assets/image (32) (1).png differ diff --git a/docs/.gitbook/assets/image (32).png b/docs/.gitbook/assets/image (32).png index dd43108eaa..9ba701a6fe 100644 Binary files a/docs/.gitbook/assets/image (32).png and b/docs/.gitbook/assets/image (32).png differ diff --git a/docs/.gitbook/assets/image (33) (3).png b/docs/.gitbook/assets/image (33) (3).png new file mode 100644 index 0000000000..6d25a50301 Binary files /dev/null and b/docs/.gitbook/assets/image (33) (3).png differ diff --git a/docs/.gitbook/assets/image (33).png b/docs/.gitbook/assets/image (33).png index 6d25a50301..1611ea8a98 100644 Binary files a/docs/.gitbook/assets/image (33).png and b/docs/.gitbook/assets/image (33).png differ diff --git a/docs/.gitbook/assets/image (34) (1) (1).png b/docs/.gitbook/assets/image (34) (1) (1).png new file mode 100644 index 0000000000..19cc56ff68 Binary files /dev/null and b/docs/.gitbook/assets/image (34) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (34) (1).png b/docs/.gitbook/assets/image (34) (1).png index 19cc56ff68..bf409ac71e 100644 Binary files a/docs/.gitbook/assets/image (34) (1).png and b/docs/.gitbook/assets/image (34) (1).png differ diff --git a/docs/.gitbook/assets/image (34) (2) (1).png b/docs/.gitbook/assets/image (34) (2) (1).png new file mode 100644 index 0000000000..ba3ef2079a Binary files /dev/null and b/docs/.gitbook/assets/image (34) (2) (1).png differ diff --git a/docs/.gitbook/assets/image (34) (2).png b/docs/.gitbook/assets/image (34) (2).png index ba3ef2079a..0d4a591548 100644 Binary files a/docs/.gitbook/assets/image (34) (2).png and b/docs/.gitbook/assets/image (34) (2).png differ diff --git a/docs/.gitbook/assets/image (34).png b/docs/.gitbook/assets/image (34).png index 0d4a591548..00f5f84117 100644 Binary files a/docs/.gitbook/assets/image (34).png and b/docs/.gitbook/assets/image (34).png differ diff --git a/docs/.gitbook/assets/image (35) (1).png b/docs/.gitbook/assets/image (35) (1).png new file mode 100644 index 0000000000..d46f59b638 Binary files /dev/null and b/docs/.gitbook/assets/image (35) (1).png differ diff --git a/docs/.gitbook/assets/image (35).png b/docs/.gitbook/assets/image (35).png index d46f59b638..55fd85506b 100644 Binary files a/docs/.gitbook/assets/image (35).png and b/docs/.gitbook/assets/image (35).png differ diff --git a/docs/.gitbook/assets/image (36) (1).png b/docs/.gitbook/assets/image (36) (1).png new file mode 100644 index 0000000000..3684deeeb6 Binary files /dev/null and b/docs/.gitbook/assets/image (36) (1).png differ diff --git a/docs/.gitbook/assets/image (36) (2).png b/docs/.gitbook/assets/image (36) (2).png new file mode 100644 index 0000000000..3bedf47498 Binary files /dev/null and b/docs/.gitbook/assets/image (36) (2).png differ diff --git a/docs/.gitbook/assets/image (36).png b/docs/.gitbook/assets/image (36).png index 3684deeeb6..dbfc15e4f6 100644 Binary files a/docs/.gitbook/assets/image (36).png and b/docs/.gitbook/assets/image (36).png differ diff --git a/docs/.gitbook/assets/image (37) (1).png b/docs/.gitbook/assets/image (37) (1).png new file mode 100644 index 0000000000..b700a7076f Binary files /dev/null and b/docs/.gitbook/assets/image (37) (1).png differ diff --git a/docs/.gitbook/assets/image (37) (2).png b/docs/.gitbook/assets/image (37) (2).png new file mode 100644 index 0000000000..251312301d Binary files /dev/null and b/docs/.gitbook/assets/image (37) (2).png differ diff --git a/docs/.gitbook/assets/image (37).png b/docs/.gitbook/assets/image (37).png index b700a7076f..94d9b7d52e 100644 Binary files a/docs/.gitbook/assets/image (37).png and b/docs/.gitbook/assets/image (37).png differ diff --git a/docs/.gitbook/assets/image (38) (1).png b/docs/.gitbook/assets/image (38) (1).png new file mode 100644 index 0000000000..46e2080c4d Binary files /dev/null and b/docs/.gitbook/assets/image (38) (1).png differ diff --git a/docs/.gitbook/assets/image (38) (2).png b/docs/.gitbook/assets/image (38) (2).png new file mode 100644 index 0000000000..61cee398b1 Binary files /dev/null and b/docs/.gitbook/assets/image (38) (2).png differ diff --git a/docs/.gitbook/assets/image (38).png b/docs/.gitbook/assets/image (38).png index 46e2080c4d..474d858432 100644 Binary files a/docs/.gitbook/assets/image (38).png and b/docs/.gitbook/assets/image (38).png differ diff --git a/docs/.gitbook/assets/image (39) (1).png b/docs/.gitbook/assets/image (39) (1).png new file mode 100644 index 0000000000..f81a63b0d6 Binary files /dev/null and b/docs/.gitbook/assets/image (39) (1).png differ diff --git a/docs/.gitbook/assets/image (39) (2).png b/docs/.gitbook/assets/image (39) (2).png new file mode 100644 index 0000000000..23d9acba1a Binary files /dev/null and b/docs/.gitbook/assets/image (39) (2).png differ diff --git a/docs/.gitbook/assets/image (39).png b/docs/.gitbook/assets/image (39).png index f81a63b0d6..122e048a60 100644 Binary files a/docs/.gitbook/assets/image (39).png and b/docs/.gitbook/assets/image (39).png differ diff --git a/docs/.gitbook/assets/image (4) (1) (3).png b/docs/.gitbook/assets/image (4) (1) (3).png new file mode 100644 index 0000000000..2a8cb2b6c6 Binary files /dev/null and b/docs/.gitbook/assets/image (4) (1) (3).png differ diff --git a/docs/.gitbook/assets/image (4) (1).png b/docs/.gitbook/assets/image (4) (1).png index 2a8cb2b6c6..63da0a3750 100644 Binary files a/docs/.gitbook/assets/image (4) (1).png and b/docs/.gitbook/assets/image (4) (1).png differ diff --git a/docs/.gitbook/assets/image (4) (2) (2).png b/docs/.gitbook/assets/image (4) (2) (2).png new file mode 100644 index 0000000000..f45d23b02b Binary files /dev/null and b/docs/.gitbook/assets/image (4) (2) (2).png differ diff --git a/docs/.gitbook/assets/image (4) (2).png b/docs/.gitbook/assets/image (4) (2).png index f45d23b02b..516fbdf12b 100644 Binary files a/docs/.gitbook/assets/image (4) (2).png and b/docs/.gitbook/assets/image (4) (2).png differ diff --git a/docs/.gitbook/assets/image (4).png b/docs/.gitbook/assets/image (4).png index 516fbdf12b..c40eedbdac 100644 Binary files a/docs/.gitbook/assets/image (4).png and b/docs/.gitbook/assets/image (4).png differ diff --git a/docs/.gitbook/assets/image (40) (1).png b/docs/.gitbook/assets/image (40) (1).png new file mode 100644 index 0000000000..8bb7a9605d Binary files /dev/null and b/docs/.gitbook/assets/image (40) (1).png differ diff --git a/docs/.gitbook/assets/image (40) (2).png b/docs/.gitbook/assets/image (40) (2).png new file mode 100644 index 0000000000..86edfb9b8f Binary files /dev/null and b/docs/.gitbook/assets/image (40) (2).png differ diff --git a/docs/.gitbook/assets/image (40).png b/docs/.gitbook/assets/image (40).png index 8bb7a9605d..e00a331039 100644 Binary files a/docs/.gitbook/assets/image (40).png and b/docs/.gitbook/assets/image (40).png differ diff --git a/docs/.gitbook/assets/image (41) (1).png b/docs/.gitbook/assets/image (41) (1).png new file mode 100644 index 0000000000..936e1da226 Binary files /dev/null and b/docs/.gitbook/assets/image (41) (1).png differ diff --git a/docs/.gitbook/assets/image (41) (2).png b/docs/.gitbook/assets/image (41) (2).png new file mode 100644 index 0000000000..9c3b273365 Binary files /dev/null and b/docs/.gitbook/assets/image (41) (2).png differ diff --git a/docs/.gitbook/assets/image (41).png b/docs/.gitbook/assets/image (41).png index 936e1da226..7c84c63caf 100644 Binary files a/docs/.gitbook/assets/image (41).png and b/docs/.gitbook/assets/image (41).png differ diff --git a/docs/.gitbook/assets/image (42) (1).png b/docs/.gitbook/assets/image (42) (1).png new file mode 100644 index 0000000000..d4653ab573 Binary files /dev/null and b/docs/.gitbook/assets/image (42) (1).png differ diff --git a/docs/.gitbook/assets/image (42).png b/docs/.gitbook/assets/image (42).png index d4653ab573..ebb9e0e37f 100644 Binary files a/docs/.gitbook/assets/image (42).png and b/docs/.gitbook/assets/image (42).png differ diff --git a/docs/.gitbook/assets/image (43) (1).png b/docs/.gitbook/assets/image (43) (1).png new file mode 100644 index 0000000000..6a5cbbf3ed Binary files /dev/null and b/docs/.gitbook/assets/image (43) (1).png differ diff --git a/docs/.gitbook/assets/image (43) (2).png b/docs/.gitbook/assets/image (43) (2).png new file mode 100644 index 0000000000..14f4c2c7d4 Binary files /dev/null and b/docs/.gitbook/assets/image (43) (2).png differ diff --git a/docs/.gitbook/assets/image (43).png b/docs/.gitbook/assets/image (43).png index 6a5cbbf3ed..6fddb23bc1 100644 Binary files a/docs/.gitbook/assets/image (43).png and b/docs/.gitbook/assets/image (43).png differ diff --git a/docs/.gitbook/assets/image (44) (1).png b/docs/.gitbook/assets/image (44) (1).png new file mode 100644 index 0000000000..82ec3e3643 Binary files /dev/null and b/docs/.gitbook/assets/image (44) (1).png differ diff --git a/docs/.gitbook/assets/image (44).png b/docs/.gitbook/assets/image (44).png index 82ec3e3643..703f272341 100644 Binary files a/docs/.gitbook/assets/image (44).png and b/docs/.gitbook/assets/image (44).png differ diff --git a/docs/.gitbook/assets/image (45) (1) (1).png b/docs/.gitbook/assets/image (45) (1) (1).png new file mode 100644 index 0000000000..8aa817fe97 Binary files /dev/null and b/docs/.gitbook/assets/image (45) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (45) (1).png b/docs/.gitbook/assets/image (45) (1).png index 8aa817fe97..f98b785514 100644 Binary files a/docs/.gitbook/assets/image (45) (1).png and b/docs/.gitbook/assets/image (45) (1).png differ diff --git a/docs/.gitbook/assets/image (45).png b/docs/.gitbook/assets/image (45).png index 8aa817fe97..c074b4a83b 100644 Binary files a/docs/.gitbook/assets/image (45).png and b/docs/.gitbook/assets/image (45).png differ diff --git a/docs/.gitbook/assets/image (46) (1).png b/docs/.gitbook/assets/image (46) (1).png new file mode 100644 index 0000000000..04e3b25978 Binary files /dev/null and b/docs/.gitbook/assets/image (46) (1).png differ diff --git a/docs/.gitbook/assets/image (46).png b/docs/.gitbook/assets/image (46).png index 04e3b25978..eeac58ff95 100644 Binary files a/docs/.gitbook/assets/image (46).png and b/docs/.gitbook/assets/image (46).png differ diff --git a/docs/.gitbook/assets/image (47) (1).png b/docs/.gitbook/assets/image (47) (1).png new file mode 100644 index 0000000000..695587ecb0 Binary files /dev/null and b/docs/.gitbook/assets/image (47) (1).png differ diff --git a/docs/.gitbook/assets/image (47).png b/docs/.gitbook/assets/image (47).png index 695587ecb0..b4af06e424 100644 Binary files a/docs/.gitbook/assets/image (47).png and b/docs/.gitbook/assets/image (47).png differ diff --git a/docs/.gitbook/assets/image (49) (1).png b/docs/.gitbook/assets/image (49) (1).png new file mode 100644 index 0000000000..388689addb Binary files /dev/null and b/docs/.gitbook/assets/image (49) (1).png differ diff --git a/docs/.gitbook/assets/image (49).png b/docs/.gitbook/assets/image (49).png index 388689addb..38956ac5c9 100644 Binary files a/docs/.gitbook/assets/image (49).png and b/docs/.gitbook/assets/image (49).png differ diff --git a/docs/.gitbook/assets/image (5) (1) (1) (3).png b/docs/.gitbook/assets/image (5) (1) (1) (3).png new file mode 100644 index 0000000000..9ccc1d05f9 Binary files /dev/null and b/docs/.gitbook/assets/image (5) (1) (1) (3).png differ diff --git a/docs/.gitbook/assets/image (5) (1) (1) (4).png b/docs/.gitbook/assets/image (5) (1) (1) (4).png new file mode 100644 index 0000000000..3e62b79545 Binary files /dev/null and b/docs/.gitbook/assets/image (5) (1) (1) (4).png differ diff --git a/docs/.gitbook/assets/image (5) (1) (1).png b/docs/.gitbook/assets/image (5) (1) (1).png index 9ccc1d05f9..8f2ac4204c 100644 Binary files a/docs/.gitbook/assets/image (5) (1) (1).png and b/docs/.gitbook/assets/image (5) (1) (1).png differ diff --git a/docs/.gitbook/assets/image (5) (1) (3).png b/docs/.gitbook/assets/image (5) (1) (3).png new file mode 100644 index 0000000000..1661778b62 Binary files /dev/null and b/docs/.gitbook/assets/image (5) (1) (3).png differ diff --git a/docs/.gitbook/assets/image (5) (1) (4).png b/docs/.gitbook/assets/image (5) (1) (4).png new file mode 100644 index 0000000000..788c5a08d1 Binary files /dev/null and b/docs/.gitbook/assets/image (5) (1) (4).png differ diff --git a/docs/.gitbook/assets/image (5) (1).png b/docs/.gitbook/assets/image (5) (1).png index 3e62b79545..3ffe03286f 100644 Binary files a/docs/.gitbook/assets/image (5) (1).png and b/docs/.gitbook/assets/image (5) (1).png differ diff --git a/docs/.gitbook/assets/image (5).png b/docs/.gitbook/assets/image (5).png index 1661778b62..ee48e7a3a9 100644 Binary files a/docs/.gitbook/assets/image (5).png and b/docs/.gitbook/assets/image (5).png differ diff --git a/docs/.gitbook/assets/image (50) (1).png b/docs/.gitbook/assets/image (50) (1).png new file mode 100644 index 0000000000..ef742342b7 Binary files /dev/null and b/docs/.gitbook/assets/image (50) (1).png differ diff --git a/docs/.gitbook/assets/image (50).png b/docs/.gitbook/assets/image (50).png index ef742342b7..3d97b23779 100644 Binary files a/docs/.gitbook/assets/image (50).png and b/docs/.gitbook/assets/image (50).png differ diff --git a/docs/.gitbook/assets/image (51) (1).png b/docs/.gitbook/assets/image (51) (1).png new file mode 100644 index 0000000000..9a76702192 Binary files /dev/null and b/docs/.gitbook/assets/image (51) (1).png differ diff --git a/docs/.gitbook/assets/image (51).png b/docs/.gitbook/assets/image (51).png index 9a76702192..17e7834ed5 100644 Binary files a/docs/.gitbook/assets/image (51).png and b/docs/.gitbook/assets/image (51).png differ diff --git a/docs/.gitbook/assets/image (53) (1).png b/docs/.gitbook/assets/image (53) (1).png new file mode 100644 index 0000000000..ae5fa4e694 Binary files /dev/null and b/docs/.gitbook/assets/image (53) (1).png differ diff --git a/docs/.gitbook/assets/image (53).png b/docs/.gitbook/assets/image (53).png index ae5fa4e694..eeb4cd1010 100644 Binary files a/docs/.gitbook/assets/image (53).png and b/docs/.gitbook/assets/image (53).png differ diff --git a/docs/.gitbook/assets/image (56) (1).png b/docs/.gitbook/assets/image (56) (1).png new file mode 100644 index 0000000000..8674c1b6b8 Binary files /dev/null and b/docs/.gitbook/assets/image (56) (1).png differ diff --git a/docs/.gitbook/assets/image (56).png b/docs/.gitbook/assets/image (56).png index 8674c1b6b8..108a9d0a1a 100644 Binary files a/docs/.gitbook/assets/image (56).png and b/docs/.gitbook/assets/image (56).png differ diff --git a/docs/.gitbook/assets/image (58) (1).png b/docs/.gitbook/assets/image (58) (1).png new file mode 100644 index 0000000000..7a97306d78 Binary files /dev/null and b/docs/.gitbook/assets/image (58) (1).png differ diff --git a/docs/.gitbook/assets/image (58).png b/docs/.gitbook/assets/image (58).png index 7a97306d78..8203c65fca 100644 Binary files a/docs/.gitbook/assets/image (58).png and b/docs/.gitbook/assets/image (58).png differ diff --git a/docs/.gitbook/assets/image (59) (2).png b/docs/.gitbook/assets/image (59) (2).png new file mode 100644 index 0000000000..fc1367dff7 Binary files /dev/null and b/docs/.gitbook/assets/image (59) (2).png differ diff --git a/docs/.gitbook/assets/image (59).png b/docs/.gitbook/assets/image (59).png index 9ddb4fe8f3..d56b49f361 100644 Binary files a/docs/.gitbook/assets/image (59).png and b/docs/.gitbook/assets/image (59).png differ diff --git a/docs/.gitbook/assets/image (6) (1) (3).png b/docs/.gitbook/assets/image (6) (1) (3).png new file mode 100644 index 0000000000..a520be4d62 Binary files /dev/null and b/docs/.gitbook/assets/image (6) (1) (3).png differ diff --git a/docs/.gitbook/assets/image (6) (1).png b/docs/.gitbook/assets/image (6) (1).png index a520be4d62..cceb01b44c 100644 Binary files a/docs/.gitbook/assets/image (6) (1).png and b/docs/.gitbook/assets/image (6) (1).png differ diff --git a/docs/.gitbook/assets/image (6).png b/docs/.gitbook/assets/image (6).png index cceb01b44c..9a44938409 100644 Binary files a/docs/.gitbook/assets/image (6).png and b/docs/.gitbook/assets/image (6).png differ diff --git a/docs/.gitbook/assets/image (61) (1).png b/docs/.gitbook/assets/image (61) (1).png new file mode 100644 index 0000000000..61cee398b1 Binary files /dev/null and b/docs/.gitbook/assets/image (61) (1).png differ diff --git a/docs/.gitbook/assets/image (61).png b/docs/.gitbook/assets/image (61).png index 9ddb4fe8f3..b593cc4923 100644 Binary files a/docs/.gitbook/assets/image (61).png and b/docs/.gitbook/assets/image (61).png differ diff --git a/docs/.gitbook/assets/image (63) (1).png b/docs/.gitbook/assets/image (63) (1).png new file mode 100644 index 0000000000..c162aae572 Binary files /dev/null and b/docs/.gitbook/assets/image (63) (1).png differ diff --git a/docs/.gitbook/assets/image (63).png b/docs/.gitbook/assets/image (63).png index c162aae572..d1c44185b3 100644 Binary files a/docs/.gitbook/assets/image (63).png and b/docs/.gitbook/assets/image (63).png differ diff --git a/docs/.gitbook/assets/image (68).png b/docs/.gitbook/assets/image (68).png new file mode 100644 index 0000000000..4bd7aece25 Binary files /dev/null and b/docs/.gitbook/assets/image (68).png differ diff --git a/docs/.gitbook/assets/image (69).png b/docs/.gitbook/assets/image (69).png new file mode 100644 index 0000000000..0b4ec24fdb Binary files /dev/null and b/docs/.gitbook/assets/image (69).png differ diff --git a/docs/.gitbook/assets/image (7) (5).png b/docs/.gitbook/assets/image (7) (5).png new file mode 100644 index 0000000000..b96b872c04 Binary files /dev/null and b/docs/.gitbook/assets/image (7) (5).png differ diff --git a/docs/.gitbook/assets/image (7).png b/docs/.gitbook/assets/image (7).png index b96b872c04..8d9ae82fd0 100644 Binary files a/docs/.gitbook/assets/image (7).png and b/docs/.gitbook/assets/image (7).png differ diff --git a/docs/.gitbook/assets/image (70).png b/docs/.gitbook/assets/image (70).png new file mode 100644 index 0000000000..3492cb756d Binary files /dev/null and b/docs/.gitbook/assets/image (70).png differ diff --git a/docs/.gitbook/assets/image (71).png b/docs/.gitbook/assets/image (71).png new file mode 100644 index 0000000000..b863abdf06 Binary files /dev/null and b/docs/.gitbook/assets/image (71).png differ diff --git a/docs/.gitbook/assets/image (72).png b/docs/.gitbook/assets/image (72).png new file mode 100644 index 0000000000..8aa2d4faa2 Binary files /dev/null and b/docs/.gitbook/assets/image (72).png differ diff --git a/docs/.gitbook/assets/image (73).png b/docs/.gitbook/assets/image (73).png new file mode 100644 index 0000000000..d809d4ba0b Binary files /dev/null and b/docs/.gitbook/assets/image (73).png differ diff --git a/docs/.gitbook/assets/image (74).png b/docs/.gitbook/assets/image (74).png new file mode 100644 index 0000000000..04e8bc33d0 Binary files /dev/null and b/docs/.gitbook/assets/image (74).png differ diff --git a/docs/.gitbook/assets/image (75).png b/docs/.gitbook/assets/image (75).png new file mode 100644 index 0000000000..36cac829f1 Binary files /dev/null and b/docs/.gitbook/assets/image (75).png differ diff --git a/docs/.gitbook/assets/image (76).png b/docs/.gitbook/assets/image (76).png new file mode 100644 index 0000000000..4f034612c3 Binary files /dev/null and b/docs/.gitbook/assets/image (76).png differ diff --git a/docs/.gitbook/assets/image (77).png b/docs/.gitbook/assets/image (77).png new file mode 100644 index 0000000000..1418d621f9 Binary files /dev/null and b/docs/.gitbook/assets/image (77).png differ diff --git a/docs/.gitbook/assets/image (78).png b/docs/.gitbook/assets/image (78).png new file mode 100644 index 0000000000..78e244e610 Binary files /dev/null and b/docs/.gitbook/assets/image (78).png differ diff --git a/docs/.gitbook/assets/image (79).png b/docs/.gitbook/assets/image (79).png new file mode 100644 index 0000000000..658e8267cb Binary files /dev/null and b/docs/.gitbook/assets/image (79).png differ diff --git a/docs/.gitbook/assets/image (8) (4).png b/docs/.gitbook/assets/image (8) (4).png new file mode 100644 index 0000000000..1d884344fa Binary files /dev/null and b/docs/.gitbook/assets/image (8) (4).png differ diff --git a/docs/.gitbook/assets/image (8).png b/docs/.gitbook/assets/image (8).png index 1d884344fa..3caa5ad6be 100644 Binary files a/docs/.gitbook/assets/image (8).png and b/docs/.gitbook/assets/image (8).png differ diff --git a/docs/.gitbook/assets/image (80).png b/docs/.gitbook/assets/image (80).png new file mode 100644 index 0000000000..efed153821 Binary files /dev/null and b/docs/.gitbook/assets/image (80).png differ diff --git a/docs/.gitbook/assets/image (81).png b/docs/.gitbook/assets/image (81).png new file mode 100644 index 0000000000..aee2abada0 Binary files /dev/null and b/docs/.gitbook/assets/image (81).png differ diff --git a/docs/.gitbook/assets/image (82).png b/docs/.gitbook/assets/image (82).png new file mode 100644 index 0000000000..f9965957a4 Binary files /dev/null and b/docs/.gitbook/assets/image (82).png differ diff --git a/docs/.gitbook/assets/image (83).png b/docs/.gitbook/assets/image (83).png new file mode 100644 index 0000000000..128a34c291 Binary files /dev/null and b/docs/.gitbook/assets/image (83).png differ diff --git a/docs/.gitbook/assets/image (84).png b/docs/.gitbook/assets/image (84).png new file mode 100644 index 0000000000..16800ecf22 Binary files /dev/null and b/docs/.gitbook/assets/image (84).png differ diff --git a/docs/.gitbook/assets/image (85).png b/docs/.gitbook/assets/image (85).png new file mode 100644 index 0000000000..2fb453295a Binary files /dev/null and b/docs/.gitbook/assets/image (85).png differ diff --git a/docs/.gitbook/assets/image (86).png b/docs/.gitbook/assets/image (86).png new file mode 100644 index 0000000000..4605c1c75f Binary files /dev/null and b/docs/.gitbook/assets/image (86).png differ diff --git a/docs/.gitbook/assets/image (87).png b/docs/.gitbook/assets/image (87).png new file mode 100644 index 0000000000..f86be3a29b Binary files /dev/null and b/docs/.gitbook/assets/image (87).png differ diff --git a/docs/.gitbook/assets/image (88).png b/docs/.gitbook/assets/image (88).png new file mode 100644 index 0000000000..013d7dccf5 Binary files /dev/null and b/docs/.gitbook/assets/image (88).png differ diff --git a/docs/.gitbook/assets/image (89).png b/docs/.gitbook/assets/image (89).png new file mode 100644 index 0000000000..2d9603c21c Binary files /dev/null and b/docs/.gitbook/assets/image (89).png differ diff --git a/docs/.gitbook/assets/image (9) (1) (5).png b/docs/.gitbook/assets/image (9) (1) (5).png new file mode 100644 index 0000000000..0fcfa15665 Binary files /dev/null and b/docs/.gitbook/assets/image (9) (1) (5).png differ diff --git a/docs/.gitbook/assets/image (9) (1).png b/docs/.gitbook/assets/image (9) (1).png index 0fcfa15665..c98f9b2510 100644 Binary files a/docs/.gitbook/assets/image (9) (1).png and b/docs/.gitbook/assets/image (9) (1).png differ diff --git a/docs/.gitbook/assets/image (9).png b/docs/.gitbook/assets/image (9).png index c98f9b2510..5ba444c6f3 100644 Binary files a/docs/.gitbook/assets/image (9).png and b/docs/.gitbook/assets/image (9).png differ diff --git a/docs/.gitbook/assets/image (90).png b/docs/.gitbook/assets/image (90).png new file mode 100644 index 0000000000..5e78348ca9 Binary files /dev/null and b/docs/.gitbook/assets/image (90).png differ diff --git a/docs/.gitbook/assets/image (91).png b/docs/.gitbook/assets/image (91).png new file mode 100644 index 0000000000..237faff50b Binary files /dev/null and b/docs/.gitbook/assets/image (91).png differ diff --git a/docs/.gitbook/assets/image (92).png b/docs/.gitbook/assets/image (92).png new file mode 100644 index 0000000000..d3f63bb282 Binary files /dev/null and b/docs/.gitbook/assets/image (92).png differ diff --git a/docs/.gitbook/assets/image (93).png b/docs/.gitbook/assets/image (93).png new file mode 100644 index 0000000000..aad7fcc552 Binary files /dev/null and b/docs/.gitbook/assets/image (93).png differ diff --git a/docs/.gitbook/assets/image (94).png b/docs/.gitbook/assets/image (94).png new file mode 100644 index 0000000000..a6e0f8328e Binary files /dev/null and b/docs/.gitbook/assets/image (94).png differ diff --git a/docs/.gitbook/assets/image (95).png b/docs/.gitbook/assets/image (95).png new file mode 100644 index 0000000000..556e47debb Binary files /dev/null and b/docs/.gitbook/assets/image (95).png differ diff --git a/docs/.gitbook/assets/image (96).png b/docs/.gitbook/assets/image (96).png new file mode 100644 index 0000000000..779fb38e93 Binary files /dev/null and b/docs/.gitbook/assets/image (96).png differ diff --git a/docs/.gitbook/assets/image (97).png b/docs/.gitbook/assets/image (97).png new file mode 100644 index 0000000000..ac6e6593b1 Binary files /dev/null and b/docs/.gitbook/assets/image (97).png differ diff --git a/docs/.gitbook/assets/image (98).png b/docs/.gitbook/assets/image (98).png new file mode 100644 index 0000000000..928df7c967 Binary files /dev/null and b/docs/.gitbook/assets/image (98).png differ diff --git a/docs/.gitbook/assets/image (99).png b/docs/.gitbook/assets/image (99).png new file mode 100644 index 0000000000..b06585c287 Binary files /dev/null and b/docs/.gitbook/assets/image (99).png differ diff --git a/docs/.gitbook/assets/image.png b/docs/.gitbook/assets/image.png index dc1ddfd4bf..79350f8b2a 100644 Binary files a/docs/.gitbook/assets/image.png and b/docs/.gitbook/assets/image.png differ diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index c50dc9c431..9877e016ce 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,6 +19,7 @@ * [🔐 Guardian Vault](guardian/readme/guardian-vault.md) * [🌎 Environments](guardian/readme/environments/README.md) * [🌎 Multi session consistency according to Environment](guardian/readme/environments/multi-session-consistency-according-to-environment.md) + * [Ecosystem Environments](guardian/readme/environments/ecosystem-environments.md) * [📃 Change Log](getting-started/change-log.md) * [🛣 Roadmap](guardian/readme/roadmap/README.md) * [☁ Cloud Infrastructure](guardian/readme/roadmap/cloud-infrastructure.md) @@ -34,8 +35,7 @@ * [🛠 Schemas](guardian/standard-registry/schemas/README.md) * [📂 Available Schema Types](available-schema-types/available-schema-types.md) * [ℹ System/Policy Schemas](guardian/standard-registry/schemas/system-policy-schemas.md) - * [💻 Creating System Schema using UI](guardian/standard-registry/schemas/creating-system-schema-using-ui.md) - * [💻 Creating Policy Schema using UI](guardian/standard-registry/schemas/creating-policy-schema-using-ui.md) + * [💻 Creating Schema using UI](guardian/standard-registry/schemas/creating-system-schema-using-ui.md) * [⚙ Schema creation using APIs](guardian/standard-registry/schemas/schema-creation-using-apis/README.md) * [Creation of a Schema (Cancelled)](schema-creation-using-the-guardian-apis/creation-of-a-schema.md) * [Listing of Schema](schema-creation-using-the-guardian-apis/creation-of-a-schema-1.md) @@ -124,6 +124,7 @@ * [historyAddon](guardian/standard-registry/policies/introduction/historyaddon.md) * [selectiveAttributes Block](guardian/standard-registry/policies/introduction/selectiveattributes-block.md) * [tagsManagerBlock](guardian/standard-registry/policies/introduction/tagsmanagerblock.md) + * [externalTopicBlock](guardian/standard-registry/policies/introduction/externaltopicblock.md) * [💻 Creating Policy using UI](policy-flow/policy-demo.md) * [💻 Creating a Policy through Policy Configurator](guardian/standard-registry/policies/creating-a-policy-through-policy-configurator/README.md) * [Getting Started with the Policy Workflows](policy-workflow-creation-using-the-guardian-user-interface/getting-started-with-the-policy-workflows.md) @@ -187,7 +188,7 @@ * [Returns List of Artifacts](dry-run-apis/returns-list-of-artifacts.md) * [Returns List of IPFS Files](dry-run-apis/returns-list-of-ipfs-files.md) * [Returning Policy to Editing](dry-run-apis/returning-policy-to-editing.md) - * [⚙ APIs for Asynchronous Execution](guardian/standard-registry/policies/apis-for-asynchronous-execution/README.md) + * [⚙ APIs for Asynchronous Execution](guardian/tokens/token-operations/apis-for-asynchronous-execution/README.md) * [Creates new Policy](policy-related-apis-for-asynchronous-execution/creates-new-policy.md) * [Publishing a Policy](policy-related-apis-for-asynchronous-execution/publishing-a-policy.md) * [Importing a Policy from IPFS](policy-related-apis-for-asynchronous-execution/importing-a-policy-from-ipfs.md) @@ -229,6 +230,11 @@ * [Deleting theme](guardian/standard-registry/policies/themes-apis/deleting-theme.md) * [Returning zip file containing themes](guardian/standard-registry/policies/themes-apis/returning-zip-file-containing-themes.md) * [Importing theme](guardian/standard-registry/policies/themes-apis/importing-theme.md) + * [💻 Demo on Integrating external policies using UI](guardian/standard-registry/policies/demo-on-integrating-external-policies-using-ui.md) + * [💻 Demo on Policy Wizard using UI](guardian/standard-registry/policies/demo-on-policy-wizard-using-ui.md) + * [⚙ Policy Wizard APIs](guardian/standard-registry/policies/policy-wizard-apis/README.md) + * [Creating new Policy](guardian/standard-registry/policies/policy-wizard-apis/creating-new-policy.md) + * [Getting Policy Configuration](guardian/standard-registry/policies/policy-wizard-apis/getting-policy-configuration.md) * [📔 Library of Policy Examples](guardian/standard-registry/policies/library-of-policy-examples/README.md) * [💻 Creating and using Roles](guardian/standard-registry/policies/library-of-policy-examples/creating-and-using-roles.md) * [🔢 Data input via Forms, using Roles to partition user activities.](guardian/standard-registry/policies/library-of-policy-examples/data-input-via-forms-using-roles-to-partition-user-activities..md) @@ -253,15 +259,21 @@ * [Returning all contract requests](guardian/standard-registry/retirement-contract/retirement-apis/returning-all-contract-requests.md) * [Deleting Contract Requests](guardian/standard-registry/retirement-contract/retirement-apis/deleting-contract-requests.md) * [Retiring Tokens](guardian/standard-registry/retirement-contract/retirement-apis/retiring-tokens.md) + * [🔐 Selective Disclosure Demo](guardian/standard-registry/selective-disclosure-demo.md) * [📒 Artifacts](guardian/standard-registry/artifacts/README.md) * [💻 Importing/Deleting Artifacts using UI](artifacts-demo/how-to-import-delete-artifacts.md) * [⚙ Artifacts APIs](guardian/standard-registry/artifacts/artifacts-apis/README.md) * [Returns all Artifacts](guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts.md) + * [(deprecated) Returns all Artifacts](guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts-1.md) * [Upload Artifacts](guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts.md) + * [(deprecated) Upload Artifacts](guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts-1.md) * [Delete Artifact](guardian/standard-registry/artifacts/artifacts-apis/delete-artifact.md) + * [(deprecated) Delete Artifact](guardian/standard-registry/artifacts/artifacts-apis/delete-artifact-1.md) * [⚙ TrustChain APIs](guardian/standard-registry/trustchain-apis/README.md) * [Requesting](trustchains-apis/requesting.md) + * [(deprecated) Requesting](guardian/standard-registry/trustchain-apis/requesting-1.md) * [Building and returning](trustchains-apis/building-and-returning.md) + * [(deprecated) Building and returning](guardian/standard-registry/trustchain-apis/building-and-returning-1.md) * [🏜 External Events](guardian/standard-registry/external-events/README.md) * [🛠 Monitoring Tools](guardian/standard-registry/external-events/monitoring-tools/README.md) * [⛏ Application-events module](guardian/standard-registry/external-events/monitoring-tools/application-events-module.md) @@ -309,10 +321,12 @@ * [Associates the user with token](token-apis/associates-the-user-with-token.md) * [Disassociates the user with token](token-apis/disassociates-the-user-with-token.md) * [Grants KYC for the user](token-apis/grants-kyc-for-the-user.md) + * [(deprecated) Grants KYC for the user](guardian/tokens/token-operations/token-apis/grants-kyc-for-the-user-1.md) * [Revoke KYC of the user](token-apis/revoke-kyc-of-the-user.md) + * [(deprecated) Revoke KYC of the user](guardian/tokens/token-operations/token-apis/revoke-kyc-of-the-user-1.md) * [Freeze Tokens of a user](token-apis/freeze-tokens-of-a-user.md) * [UnFreeze Tokens of a user](token-apis/unfreeze-tokens-of-a-user.md) - * [⚙ APIs for Asynchronous Execution](guardian/tokens/token-operations/apis-for-asynchronous-execution/README.md) + * [⚙ APIs for Asynchronous Execution](guardian/standard-registry/policies/apis-for-asynchronous-execution/README.md) * [Token Creation](token-related-apis-for-asynchronous-execution/token-creation.md) * [Associating User with the Hedera Token](token-related-apis-for-asynchronous-execution/associating-user-with-the-hedera-token.md) * [Disassociating User with the Hedera Token](token-related-apis-for-asynchronous-execution/disassociating-user-with-the-hedera-token.md) @@ -332,13 +346,23 @@ * [💻 iREC 7 Demo UI Guide](guardian/demo-guide/renewable-energy-credits/irec-7-demo-guide.md) * [☘ Carbon Offsets](guardian/demo-guide/carbon-offsets/README.md) * [📖 Introduction to Verra Redd+](guardian/demo-guide/carbon-offsets/introduction-to-verra-redd+.md) - * [💻 Verra Redd+ Demo UI Guide](guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md) - * [🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 Dovu Methodologies](guardian/demo-guide/carbon-offsets/dovu-methodologies.md) + * [💻 Verra Redd VM0007 Demo UI Guide](guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md) + * [🧑🌾 Verra VM0017 REDD+ Methodology](guardian/demo-guide/carbon-offsets/verra-vm0017-redd+-methodology.md) + * [🧑🌾 Verra VM0042 REDD+ Methodology](guardian/demo-guide/carbon-offsets/verra-vm0042-redd+-methodology.md) + * [🌲 Verra Afforestation, Reforestation, and Revegetation (ARR) v0.1](guardian/demo-guide/carbon-offsets/verra-afforestation-reforestation-and-revegetation-arr-v0.1.md) + * [🌲 Gold Standard Afforestation and Reforestation (AR) v2.0](guardian/demo-guide/carbon-offsets/gold-standard-afforestation-and-reforestation-ar-v2.0.md) + * [🧑🌾 🧑🌾 Dovu Methodologies](guardian/demo-guide/carbon-offsets/dovu-methodologies.md) * [♨ Improved Cookstove](guardian/demo-guide/carbon-offsets/improved-cookstove.md) - * [🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 🧑🌾 Carbon Reduction Measurement - GHG Corporate Standard Policy Guide](guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md) + * [♨ GoldStandard - Metered Energy Cooking](guardian/demo-guide/carbon-offsets/goldstandard-metered-energy-cooking.md) + * [🧑🌾 🧑🌾 Carbon Reduction Measurement - GHG Corporate Standard Policy Guid](guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md) * [🏭 Carbon Emissions](guardian/demo-guide/carbon-emissions/README.md) * [🏡 Remote Work GHG Policy](guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/README.md) * [📖 Introduction to Remote Work GHG](guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/introduction-to-remote-work-ghg.md) * [💻 Remote GHG Policy Demo Guide](guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/remote-ghg-policy-demo-guide.md) * [🏢 Carbon Emissions Measurement - GHG Corporate Standard Policy Guide](guardian/demo-guide/carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md) + * [🏭 atma GHG Scope II Carbon Emission Policy](guardian/demo-guide/carbon-emissions/atma-ghg-scope-ii-carbon-emission-policy.md) * [❓ FAQs](faqs/faqs.md) + +*** + +* [📉 Monitoring tools](monitoring-tools.md) diff --git a/docs/available-policy-workflow-blocks/customlogicblock.md b/docs/available-policy-workflow-blocks/customlogicblock.md index 62ab583d57..b16d65d3d2 100644 --- a/docs/available-policy-workflow-blocks/customlogicblock.md +++ b/docs/available-policy-workflow-blocks/customlogicblock.md @@ -2,16 +2,7 @@ ## Properties -| Block Property | Definition | Example Input | Status | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | multiSignBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | NoRole | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | -| Output Schema | Sending the logic output to this particular Schema | Report Employee schema | | -| Document Signer |

defines who will sign processed document.
Options:
1. Policy Owner
2. First Document Owner
3. First Document Issues

| Policy Owner | | -| Id Type |

defines Id Type in credential subject of processed document.
Options:
1. DID (new DID)
2. UUID (new UUID)
3. Owner (Owner DID)

| UUID (new UUID) | | +
Block PropertyDefinitionExample InputStatus
tagUnique name for the logic block.multiSignBlock
permissionsWhich entity has rights to interact at this part of the workflow.NoRole
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
On errorsCalled if the system error has occurs in the Block

  • No action
  • Retry
  • Go to step
  • Go to tag
Stop PropagationEnd processing here, don't pass control to the next block.Checked or unchecked.
Output SchemaSending the logic output to this particular SchemaReport Employee schema
Document Signerdefines who will sign processed document.
Options:
1. Policy Owner
2. First Document Owner
3. First Document Issues
Policy Owner
Id Typedefines Id Type in credential subject of processed document.
Options:
1. DID (new DID)
2. UUID (new UUID)
3. Owner (Owner DID)
UUID (new UUID)
{% hint style="info" %} **Note:** Only this block supports artifacts for now. diff --git a/docs/available-policy-workflow-blocks/documentssourceaddonblock.md b/docs/available-policy-workflow-blocks/documentssourceaddonblock.md index dac6247a65..0fb5b1e883 100644 --- a/docs/available-policy-workflow-blocks/documentssourceaddonblock.md +++ b/docs/available-policy-workflow-blocks/documentssourceaddonblock.md @@ -6,20 +6,7 @@ Note: This block is used for dropdown. You can add multiple blocks to 1 grid to ### Properties -| Block Property | Definition | Example Input | Status | -| ------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- | ------------------------------------------ | -| type | A block for searching VC, for grid | **DocumentsSourceAddOn** Block (Can't be changed). | | -| tag | Unique name for the logic block. | approve_d\_documents\__grid\_source | | -| permissions | Which entity has rights to interact at this part of the workflow. | Installer. | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| dependencies | Automatic update. The block is automatically re-rendered if any of the linked components gets updated. | Select the appropriate block from the dropdown. | | -| Data Type | Specify the table to request the data from. | Current options are: Verifiable Credential, DID, Approve, or Hedera. | | -| Schema | Filters the VC according to the selected scheme | iRec Application Details (1.0.0) PUBLISHED | | -| onlyOwnDocuments | When checked, filter out only VCs created by the user | checked or unchecked | | -| onlyAssignDocuments | When checked, it filter only VCs assigned to the user | checked or unchecked | | -| ViewHistory | When checked, documents in the Grid will be displayed with status timeline | checked or unchecked | Deprecated | -| Order Field | name of the field | Source | | -| Order Direction | Ascending or Descending direction of the order | ASC/DESC | | +
Block PropertyDefinitionExample InputStatus
typeA block for searching VC, for gridDocumentsSourceAddOn Block (Can't be changed).
tagUnique name for the logic block.approved_documents_grid_source
permissionsWhich entity has rights to interact at this part of the workflow.Installer.
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
dependenciesAutomatic update. The block is automatically re-rendered if any of the linked components gets updated.Select the appropriate block from the dropdown.
Data TypeSpecify the table to request the data from.Current options are: Verifiable Credential, DID, Approve, or Hedera.
SchemaFilters the VC according to the selected schemeiRec Application Details (1.0.0) PUBLISHED
onlyOwnDocumentsWhen checked, filter out only VCs created by the userchecked or unchecked
onlyAssignDocumentsWhen checked, it filter only VCs assigned to the userchecked or unchecked
ViewHistoryWhen checked, documents in the Grid will be displayed with status timelinechecked or uncheckedDeprecated
Order Fieldname of the fieldSource
Order DirectionAscending or Descending direction of the orderASC/DESC
{% hint style="info" %} Note: If no Order Field is specified, but Order Direction is specified, then Order Field will be automatically filled = createDate and data will be sorted by createDate diff --git a/docs/available-policy-workflow-blocks/documentvalidatorblock.md b/docs/available-policy-workflow-blocks/documentvalidatorblock.md index 2eabeadb30..68eab9a919 100644 --- a/docs/available-policy-workflow-blocks/documentvalidatorblock.md +++ b/docs/available-policy-workflow-blocks/documentvalidatorblock.md @@ -6,18 +6,7 @@ This block is to validate documents, including linked documents. This block retu ### Properties -| Block Property | Definition | Example Input | Status | -| --------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | documentValidatorBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | VVB | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | -| DocumentType | Type of the documents to be validated. |

· VC Document

· VP Document

· Related VC
Document

. Related VP Document

| | -| Check Schema | Validates schema documents. | Schema | | -| Check Own Document | If ‘true’ validates document owners. | True / False | | -| Check Assign Document | If ‘true’ validates document owners. | True / False | | -| Conditions | Array containing conditions for validation. | Array | | +
Block PropertyDefinitionExample InputStatus
tagUnique name for the logic block.documentValidatorBlock
permissionsWhich entity has rights to interact at this part of the workflow.VVB
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
On errorsCalled if the system error has occurs in the Block

  • No action
  • Retry
  • Go to step
  • Go to tag
stop PropagationEnd processing here, don't pass control to the next block.Checked or unchecked.
DocumentTypeType of the documents to be validated.

· VC Document

· VP Document

· Related VC
Document

. Related VP Document

Check SchemaValidates schema documents.Schema
Check Own DocumentIf ‘true’ validates document owners.True / False
Check Assign DocumentIf ‘true’ validates document owners.True / False
ConditionsArray containing conditions for validation.Array
diff --git a/docs/available-policy-workflow-blocks/groupmanagerblock.md b/docs/available-policy-workflow-blocks/groupmanagerblock.md index 359db902b7..c4464b1470 100644 --- a/docs/available-policy-workflow-blocks/groupmanagerblock.md +++ b/docs/available-policy-workflow-blocks/groupmanagerblock.md @@ -9,36 +9,34 @@ This block allows to manage group membership, add and remove users from the grou | tag | Unique name for the logic block. | groupManagerBlock | | | permissions | Which entity has rights to interact at this part of the workflow. | NoRole | | | defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | +| On errors | Called if the system error has occurs in the Block |
  • No action
  • Retry
  • Go to step
  • Go to tag
| | | Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | | Can Invite | specifies who can create invites |

· Group Owner – only the creator of the group

· All – all members of the group

| | | Can Delete | specifies who can remove users from the group |

· Group Owner – only the creator of the group

. All – all members of the group

| | - -
### 2. Usage -#### 2.1 **List of the groups in which the user is included:** +#### 2.1 **List of the groups in which the user is included:**
-#### **2.2 List of the users included in the group** +#### **2.2 List of the users included in the group**
-#### **2.3 Inviting users to groups** +#### **2.3 Inviting users to groups** First step is to select the role to invite the user as shown below: -
+
Next step is to copy and send the unique invite or the link to the invite. -
+
-#### 2.4 **Removing users from groups** +#### 2.4 **Removing users from groups**
diff --git a/docs/available-policy-workflow-blocks/information-workflow-block.md b/docs/available-policy-workflow-blocks/information-workflow-block.md index 62683d5f50..da741c67ba 100644 --- a/docs/available-policy-workflow-blocks/information-workflow-block.md +++ b/docs/available-policy-workflow-blocks/information-workflow-block.md @@ -2,14 +2,7 @@ ### Properties -| Block Property | Definition | Example Input | Status | -| ---------------- | --------------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------ | -| type | A block type which can display a notification or a progress bar. | **InformationBlock** (Can't be changed). | | -| tag | Unique name for the logic block. | wait\_for\_approval. | | -| permissions | Which entity has rights to interact at this part of the workflow. | Installer. | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| dependencies | Establish workflow dependancies that need to be completed prior. | Select the appropriate block from the dropdown. | Deprecated | -| stop Propagation | End processing here, don't pass control to the next block. | Checked or Unchecked. | | +
Block PropertyDefinitionExample InputStatus
typeA block type which can display a notification or a progress bar.InformationBlock (Can't be changed).
tagUnique name for the logic block.wait_for_approval.
permissionsWhich entity has rights to interact at this part of the workflow.Installer.
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
dependenciesEstablish workflow dependancies that need to be completed prior.Select the appropriate block from the dropdown.Deprecated
stop PropagationEnd processing here, don't pass control to the next block.Checked or Unchecked.
{% hint style="info" %} RefreshEvents are used to refreshing the UI, instead of "dependencies" property. diff --git a/docs/available-policy-workflow-blocks/interfacedocumentssourceblock.md b/docs/available-policy-workflow-blocks/interfacedocumentssourceblock.md index 54e93db789..f704396811 100644 --- a/docs/available-policy-workflow-blocks/interfacedocumentssourceblock.md +++ b/docs/available-policy-workflow-blocks/interfacedocumentssourceblock.md @@ -2,14 +2,7 @@ ### Properties -| Block Property | Definition | Example Input | Status | -| -------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- | ------------------------------------------ | -| type | A block type which outputs information from the DB as grid. | **InterfaceDocumentsSource** Block (Can't be changed). | | -| tag | Unique name for the logic block. | sensors\_grid. | | -| permissions | Which entity has rights to interact at this part of the workflow. | Installer. | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| dependencies | Automatic update. The block is automatically re-rendered if any of the linked components gets updated. | Select the appropriate block from the dropdown. | Deprecated | -| dataType | Specify the table to request the data from. | Current options are: Verifiable Credential, DID, Approve, or Hedera. | | +
Block PropertyDefinitionExample InputStatus
typeA block type which outputs information from the DB as grid.InterfaceDocumentsSource Block (Can't be changed).
tagUnique name for the logic block.sensors_grid.
permissionsWhich entity has rights to interact at this part of the workflow.Installer.
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
dependenciesAutomatic update. The block is automatically re-rendered if any of the linked components gets updated.Select the appropriate block from the dropdown.Deprecated
dataTypeSpecify the table to request the data from.Current options are: Verifiable Credential, DID, Approve, or Hedera.
{% hint style="info" %} RefreshEvents are used to refreshing the UI, instead of "dependencies" property. @@ -17,23 +10,7 @@ RefreshEvents are used to refreshing the UI, instead of "dependencies" property. ### UI Properties -| UI Property | Definition | -| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Title | Type of the displayed value, possible options. Current options are: TEXT (ordinary text), BUTTON (a button), or BLOCK (a block embedded into the column). | -| Enable common sorting |

  1. When it is true, user can sort grid data on UI side, or make POST request to interfaceSourceBlock with body ({ orderField: 'option.status', orderDirection: 'asc'}) to change sorting through the API
  2. When it is false, user can set order to specific documentSourceAddon block by POST request with same body through the API
| -| Field Name | Object fields to retrieve the values from. Internal fields are separated by ".", access to array elements is via index. This is the field name. | -| Field Type | Current Options: TEXT, BUTTON, AND BLOCK. | -| Field Title | Title of the column. | -| Field Tooltip | Provide a tooltip for the field. | -| Field Cell Content | Content inside the cell. | -| Field UI Class | Arbitrary Class | -| Width | For example : 100px | -| Bind Group | If interfaceDocumentsSourceBlock has more than one documentsSourceAddon, then you can create different columns for each (names must be the same) | -| Bind Block | Specifying a "bindBlock" field would result in the display of the linked block in side the dialog.. Needs for the field type to be a BLOCK or BUTTON with the Action type as DIALOGUE. | -| Action | Needs for the field type to be a BUTTON. Specifies what action will happen when the button is clicked. Action options are currently: LINK to a URL or prompt a DIALOGUE box. | -| Dialogue Type | Currently only json type is supported. Needs for the field type to be a BUTTON and Action to be DIALOGUE. | -| Dialogue Content | Provide content for the dialogue box. Needs for the field type to be a BUTTON and Action to be DIALOGUE. | -| Dialogue Class | Dialog style. Needs for the field type to be a BUTTON and Action to be DIALOGUE. | +
UI PropertyDefinition
TitleType of the displayed value, possible options. Current options are: TEXT (ordinary text), BUTTON (a button), or BLOCK (a block embedded into the column).
Enable common sorting

  1. When it is true, user can sort grid data on UI side, or make POST request to interfaceSourceBlock with body ({ orderField: 'option.status', orderDirection: 'asc'}) to change sorting through the API
  2. When it is false, user can set order to specific documentSourceAddon block by POST request with same body through the API
Field NameObject fields to retrieve the values from. Internal fields are separated by ".", access to array elements is via index. This is the field name.
Field TypeCurrent Options: TEXT, BUTTON, AND BLOCK.
Field TitleTitle of the column.
Field TooltipProvide a tooltip for the field.
Field Cell ContentContent inside the cell.
Field UI ClassArbitrary Class
WidthFor example : 100px
Bind GroupIf interfaceDocumentsSourceBlock has more than one documentsSourceAddon, then you can create different columns for each (names must be the same)
Bind BlockSpecifying a "bindBlock" field would result in the display of the linked block in side the dialog.. Needs for the field type to be a BLOCK or BUTTON with the Action type as DIALOGUE.
ActionNeeds for the field type to be a BUTTON. Specifies what action will happen when the button is clicked. Action options are currently: LINK to a URL or prompt a DIALOGUE box.
Dialogue TypeCurrently only json type is supported. Needs for the field type to be a BUTTON and Action to be DIALOGUE.
Dialogue ContentProvide content for the dialogue box. Needs for the field type to be a BUTTON and Action to be DIALOGUE.
Dialogue ClassDialog style. Needs for the field type to be a BUTTON and Action to be DIALOGUE.
### Events diff --git a/docs/available-policy-workflow-blocks/introduction.md b/docs/available-policy-workflow-blocks/introduction.md index 9cab559a2f..2731d255aa 100644 --- a/docs/available-policy-workflow-blocks/introduction.md +++ b/docs/available-policy-workflow-blocks/introduction.md @@ -45,3 +45,4 @@ Starting with the [Wikipedia definition](https://en.wikipedia.org/wiki/Workflow\ | historyAddon | This block turn on history on interfaceDocumentsSourceBlock. | [historyAddon](../guardian/standard-registry/policies/introduction/historyaddon.md) | | selectiveAttributes Block | This block will filter attributes (option field) in documents returned by documentsSourceAddon. | [selectiveAttributesBlock](../guardian/standard-registry/policies/introduction/selectiveattributes-block.md) | | tagsManagerBlock | This block is responsible for managing tags in policies. | [tagsManagerBlock](../guardian/standard-registry/policies/introduction/tagsmanagerblock.md) | +| externalTopicBlock | This block allows to configure the link to Hedera topics established by other policy instances for monitoring of ‘document published’ messages and ingestion of the targeted VC documents. | [externalTopicBlock](../guardian/standard-registry/policies/introduction/externaltopicblock.md) | diff --git a/docs/available-policy-workflow-blocks/mintdocumentblock.md b/docs/available-policy-workflow-blocks/mintdocumentblock.md index 8063ba4600..6fd271ff5a 100644 --- a/docs/available-policy-workflow-blocks/mintdocumentblock.md +++ b/docs/available-policy-workflow-blocks/mintdocumentblock.md @@ -4,13 +4,7 @@ This block is responsible for adding configurations on calculating the amount of ### Properties -| Block Property | Definition | Example Input | Status | -| ---------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | mintDocumentBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | VVB | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | +
Block PropertyDefinitionExample InputStatus
tagUnique name for the logic block.mintDocumentBlock
permissionsWhich entity has rights to interact at this part of the workflow.VVB
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
On errorsCalled if the system error has occurs in the Block

  • No action
  • Retry
  • Go to step
  • Go to tag
Stop PropagationEnd processing here, don't pass control to the next block.Checked or unchecked.
### UI Properties @@ -25,7 +19,7 @@ This block is responsible for adding configurations on calculating the amount of | Use Template | This needs to be enabled if we need to use token template, which is created already. | Enabled/Disabled | | Token Template | Which will take created tokenId from input document by template name | token\_template_\__0 | -
+
{% hint style="info" %} **Notes:** diff --git a/docs/available-policy-workflow-blocks/multisignblock.md b/docs/available-policy-workflow-blocks/multisignblock.md index 79ee5de658..3399ea92f7 100644 --- a/docs/available-policy-workflow-blocks/multisignblock.md +++ b/docs/available-policy-workflow-blocks/multisignblock.md @@ -4,16 +4,14 @@ This block provides a way to specify multiple signators for a single VC document ### 1. Properties -| Block Property | Definition | Example Input | Status | -| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | multiSignBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | NoRole | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | -| Threshold (%) | Proportion Of signators which are required to sign the document to achieve quorum for it to transition to ‘signed’ status. Must be a number between 0 and 100. | 0-100 | | - - +| Block Property | Definition | Example Input | Status | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------ | +| tag | Unique name for the logic block. | multiSignBlock | | +| permissions | Which entity has rights to interact at this part of the workflow. | NoRole | | +| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | +| On errors | Called if the system error has occurs in the Block |
  • No action
  • Retry
  • Go to step
  • Go to tag
| | +| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | +| Threshold (%) | Proportion Of signators which are required to sign the document to achieve quorum for it to transition to ‘signed’ status. Must be a number between 0 and 100. | 0-100 | | {% hint style="info" %} **Note:** The system assigns ‘not signed’ status to the document when 100 – threshold percentage of users indicated rejection status. @@ -28,7 +26,7 @@ This block provides a way to specify multiple signators for a single VC document ### 3. Data Format -#### 3.1 POST request +#### 3.1 POST request ``` { @@ -80,11 +78,11 @@ This block provides a way to specify multiple signators for a single VC document 4.1.1 multiSignBlock must be used with Groups. -
+
4.1.2 multiSignBlock must be child block of grid block to receive all data it requires to operate. -
+
### 5. UI @@ -92,7 +90,7 @@ This block provides a way to specify multiple signators for a single VC document We have an option of Signing/ Declining the document by clicking on "Sign" or "Decline" button for the document as shown below: -
+
#### 5.2 Threshold Display diff --git a/docs/available-policy-workflow-blocks/paginationaddon.md b/docs/available-policy-workflow-blocks/paginationaddon.md index e4435abd66..0935f23f27 100644 --- a/docs/available-policy-workflow-blocks/paginationaddon.md +++ b/docs/available-policy-workflow-blocks/paginationaddon.md @@ -1,6 +1,6 @@ # paginationAddon -### Properties +## Properties | Block Property | Definition | Example Input | | -------------- | --------------------------------------------------------------------------------- | ----------------------------------------------- | @@ -10,3 +10,96 @@ | defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or Unchecked | | dependencies | Establish workflow dependancies that need to be completed prior. | Select the appropriate block from the dropdown. | +## API Parameters + +{% swagger method="get" path="" baseUrl="/policies/{policyId}/blocks/{uuid}" summary="Requests Block Data" %} +{% swagger-description %} +Requests Block Data +{% endswagger-description %} + +{% swagger-parameter in="path" name="policyId" type="String" required="true" %} +Selected policy ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="uuid" type="String" required="true" %} +Selected Block UUID +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Succesful Operation" %} +``` +{ + "size": 5, + "itemsPerPage": 10, + "page": 0 +} +``` +{% endswagger-response %} +{% endswagger %} + +{% swagger method="get" path="" baseUrl="/policies/{policyId}/tag/{tag}/blocks" summary="Requests Block Data by Tag" %} +{% swagger-description %} +Requests Block Data by Tag +{% endswagger-description %} + +{% swagger-parameter in="path" name="policyId" type="String" required="true" %} +Selected Policy ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="tag" type="String" required="true" %} +Tag from the selected policy +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} +``` +{ + "size": 5, + "itemsPerPage": 10, + "page": 0 +} +``` +{% endswagger-response %} +{% endswagger %} + +{% swagger method="post" path="" baseUrl="/policies/{policyId}/blocks/{uuid}" summary="Sends data to the specified block" %} +{% swagger-description %} +Sends data to the specified block +{% endswagger-description %} + +{% swagger-parameter in="path" name="policyId" type="String" required="true" %} +Selected Policy ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="uuid" type="String" required="true" %} +Selected Block UUID +{% endswagger-parameter %} + +{% swagger-parameter in="body" type="Object" required="true" %} +Object with the data to be sent to the block +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} + +{% endswagger-response %} +{% endswagger %} + +{% swagger method="post" path="" baseUrl="/policies/{policyId}/tag/{tag}/blocks" summary="Sends data to the specified block by tag" %} +{% swagger-description %} +Sends data to the specified block +{% endswagger-description %} + +{% swagger-parameter in="path" name="policyId" type="String" required="true" %} +Selected Policy ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="uuid" type="String" required="true" %} +Selected Block UUID +{% endswagger-parameter %} + +{% swagger-parameter in="body" type="Object" required="true" %} +Object with the data to be sent to the block +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} + +{% endswagger-response %} +{% endswagger %} diff --git a/docs/available-policy-workflow-blocks/reassigningblock.md b/docs/available-policy-workflow-blocks/reassigningblock.md index a89a8b9fdc..4eecc0186c 100644 --- a/docs/available-policy-workflow-blocks/reassigningblock.md +++ b/docs/available-policy-workflow-blocks/reassigningblock.md @@ -2,16 +2,7 @@ ### Properties -| Block Property | Definition | Example Input | Status | -| ---------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------ | -| type | A block type which re-signs the document and change the user to document owner. | **reassigningBlock** (Can't be changed). | | -| tag | Unique name for the logic block. | wait\_for\_approval. | | -| permissions | Which entity has rights to interact at this part of the workflow. | Installer. | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| dependencies | Establish workflow dependancies that need to be completed prior. | Select the appropriate block from the dropdown. | Deprecated | -| stop Propagation | End processing here, don't pass control to the next block. | Checked or Unchecked. | | -| issuer | Person, who will be a Signer |

not set - Current User
owner - document Owner
policyOwner - Policy Owner

| | -| actor | Person, who will be next Block Owner |

not set - Current User
owner - document Owner
issuer - document Issuer

| | +
Block PropertyDefinitionExample InputStatus
typeA block type which re-signs the document and change the user to document owner.reassigningBlock (Can't be changed).
tagUnique name for the logic block.wait_for_approval.
permissionsWhich entity has rights to interact at this part of the workflow.Installer.
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
dependenciesEstablish workflow dependancies that need to be completed prior.Select the appropriate block from the dropdown.Deprecated
stop PropagationEnd processing here, don't pass control to the next block.Checked or Unchecked.
issuerPerson, who will be a Signernot set - Current User
owner - document Owner
policyOwner - Policy Owner
actorPerson, who will be next Block Ownernot set - Current User
owner - document Owner
issuer - document Issuer
{% hint style="info" %} RefreshEvents are used to refreshing the UI, instead of "dependencies" property. diff --git a/docs/available-policy-workflow-blocks/splitblock.md b/docs/available-policy-workflow-blocks/splitblock.md index 1b3590b9ff..5cc7fb6c5b 100644 --- a/docs/available-policy-workflow-blocks/splitblock.md +++ b/docs/available-policy-workflow-blocks/splitblock.md @@ -8,15 +8,7 @@ If the value in the VC is higher than the chunking threshold the VC would be “ -| Block Property | Definition | Example Input | Status | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | multiSignBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | NoRole | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | -| Threshold |

The size of a single ‘portion’ (chunk) the original document would be “split” into.
Note: It is always number>0

| 1000 | | -| Source field |

It is the path to the field in the VC document which is the parameter used in the calculation of the ‘size’ of the VC.
Note: is a field to which the ‘source field’ path points. It must be of numeric type.

| source path link | | +
Block PropertyDefinitionExample InputStatus
tagUnique name for the logic block.multiSignBlock
permissionsWhich entity has rights to interact at this part of the workflow.NoRole
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
On errorsCalled if the system error has occurs in the Block

  • No action
  • Retry
  • Go to step
  • Go to tag
Stop PropagationEnd processing here, don't pass control to the next block.Checked or unchecked.
ThresholdThe size of a single ‘portion’ (chunk) the original document would be “split” into.
Note: It is always number>0
1000
Source fieldIt is the path to the field in the VC document which is the parameter used in the calculation of the ‘size’ of the VC.
Note: is a field to which the ‘source field’ path points. It must be of numeric type.
source path link
## 2. Data(VC documents) format diff --git a/docs/available-policy-workflow-blocks/tokenactionblock.md b/docs/available-policy-workflow-blocks/tokenactionblock.md index 5392be9250..a416074396 100644 --- a/docs/available-policy-workflow-blocks/tokenactionblock.md +++ b/docs/available-policy-workflow-blocks/tokenactionblock.md @@ -4,19 +4,7 @@ This block is responsible in performing automatic actions on the token. ### Properties -| Block Property | Definition | Example Input | Status | -| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------ | -| tag | Unique name for the logic block. | tokenActionBlock | | -| permissions | Which entity has rights to interact at this part of the workflow. | VVB | | -| defaultActive | Shows whether this block is active at this time and whether it needs to be shown. | Checked or unchecked. | | -| On errors | Called if the system error has occurs in the Block |

  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or unchecked. | | -| Token | The token which is affected by the action | iREC token | | -| Account Type |

The type of the account under which the action is performed. If set to ‘Default’ the account of the currently logged in user is used (i.e. the owner of the document).

If set to ‘Custom’ the account specified in the ‘accountId’ field is used.

| Custom | | -| Account Id (Field) | The value from this field is used as the ID of the account under which the action is performed when ‘Account Type’ is set to ‘Custom’. | field0 | | -| Action | Action to be performed on Token |

  • Associate
  • Dissociate
  • Freeze
  • Unfreeze
  • Grant Kyc
  • Revoke Kyc
| | -| Use Template | This needs to be enabled if we need to use token template, which is created already. | Enabled or Disabled | | -| Token Template | Which will take created tokenId from input document by template name | token\_template_\__0 | | +
Block PropertyDefinitionExample InputStatus
tagUnique name for the logic block.tokenActionBlock
permissionsWhich entity has rights to interact at this part of the workflow.VVB
defaultActiveShows whether this block is active at this time and whether it needs to be shown.Checked or unchecked.
On errorsCalled if the system error has occurs in the Block

  • No action
  • Retry
  • Go to step
  • Go to tag
Stop PropagationEnd processing here, don't pass control to the next block.Checked or unchecked.
TokenThe token which is affected by the actioniREC token
Account Type

The type of the account under which the action is performed. If set to ‘Default’ the account of the currently logged in user is used (i.e. the owner of the document).

If set to ‘Custom’ the account specified in the ‘accountId’ field is used.

Custom
Account Id (Field)The value from this field is used as the ID of the account under which the action is performed when ‘Account Type’ is set to ‘Custom’.field0
ActionAction to be performed on Token

  • Associate
  • Dissociate
  • Freeze
  • Unfreeze
  • Grant Kyc
  • Revoke Kyc
Use TemplateThis needs to be enabled if we need to use token template, which is created already.Enabled or Disabled
Token TemplateWhich will take created tokenId from input document by template nametoken_template_0
diff --git a/docs/available-policy-workflow-blocks/tokenconfirmationblock.md b/docs/available-policy-workflow-blocks/tokenconfirmationblock.md index e9448108ff..1b75d6f809 100644 --- a/docs/available-policy-workflow-blocks/tokenconfirmationblock.md +++ b/docs/available-policy-workflow-blocks/tokenconfirmationblock.md @@ -44,7 +44,7 @@ The user need to input the private key for the account to enable Guardian to per **Note:** Users can skip the action in UI if they prefer to perform it outside Guardian (directly with Hedera blockchain). {% endhint %} -![](<../.gitbook/assets/image (17) (2).png>) +![](<../.gitbook/assets/image (17) (2) (1).png>) ### API Parameters diff --git a/docs/environments/Ecosystem-Environment.md b/docs/environments/Ecosystem-Environment.md new file mode 100644 index 0000000000..a335ac9476 --- /dev/null +++ b/docs/environments/Ecosystem-Environment.md @@ -0,0 +1,257 @@ +### Ecosystem Environments +###### \#1923, \#1639 + + +The set of environmet parameters represent the context in which a service it is executed. Each service needs to know this context to adapt its behaviour to the real working condition. At the service level the node dotenv library allows to read environment of the kind \ this library by default reads from .env file. The data are reads in a the process.environment data structure available in the execution context of Node process. +A unique file define the environment and keeps the responsibility to create the shared operative ecosystem. + + + All Guardian Microservices share a common set of Environment variables. In this way Guardian can be seen as an ecosystem with several services and common set of parameters leading his behaviour. This environment parameters are shared between all the services of the Guardian ecosystem. +All variables are defined in a ".env.\.guardian.system" file. The file name is parametric so it is possible to define a different files for different possible running configuration, for example production, develop, test1. The ecosystem environment file follow the .env.template.guardian.system file that let write new configurations with the set of necessary variables. Both the template file and the resulting environmets files are in the folder "./configs/", they can be discriminated by its name to spread the session. + +The parameter GUARDIAN_ENV is defined univocally in a .env file. The containers orchestration will be responsible to push the environment in to the container in a way the environment will be available to the Node server. For example in the execution of Guardian using docker compose tool the tool inject the environment in each container. Docker compose push the environment in the container by the means of the env-file attribute and the environment attribute. Overmore the environment attribute can be parametrized by variables defined in a ".env" file located next to the docker_compose.yaml. + +![hierarchy.png](https://images.zenhubusercontent.com/63dbe2bd4d4d6290bed6780c/12790cd6-19b5-4f3c-aad2-9d28081e8498) + +Also Guardian services are allowed to define specific service variables. This different set of variables allow to have a hierarchical definition of the same variable in a way that a developer could redefine some of them in a service specific way or add new variables extending the usage of the ecosystem environment. +The environment variables that are specific to services can be specified by the means of .env.\.\ files in each service. + + +Per each installed service the environment is configured using the two file: +1) ".env" file +2) "./guardian/\/configs/.env.\.develop" file + +The environment is loaded in the service by the file config.ts. the Environment is read in to two steps: at first steps the service .env file is loaded by Node while at second step ".env.\.\" file is loaded. +A new environmet variable OVERRIDE as "true"/"false" it has been added to let variables defined in the ".env.\.\.\" to override the common defined variables or add new ones. For example If OVERRIDE=true a variable with the same name as the one already defined in the ".env"" file will assume the value specify at service level. The OVERRIDE parameter is not mandatory. if OVERRIDE="false" (default value) specific service variables can only be added to the global ones. In each service a new "./configs" folder holds the set of paramentric service level environment files. + +With this implementation the service orchestrator can push not just the econsystem environment but the service specific variables too or leave the service specific variables under the responsibility of the service itself. + +For example it is possible to use docker compose to orchestrate the service in a single node. Dcoker compose has “env-file” and “environment” attributes to define environment. There is a precedence between this two attributes as define at https://docs.docker.com/compose/environment-variables/envvars-precedence/#simple-example. +In this way override=”true” always and variables re-assigned in the environment attributes override what has been defined in the .env.\.guardian.system env-file. + + +EXAMPLES: +--------- + +Configure each service without an orchestrator +----------------------------------------------- + +configure .env, in ./guardian/\/.env. Insert the variable GUARDIAN_ENV and give it the name that you choose for you Guardian platform environment (production, develop ...). If you update a production environment to keep working with your previous data leave the field GUARDIAN_ENV="" empty. + +The OVERRIDE variable is not mandatory and it default to "false". +```plaintext +GUARDIAN_ENV="develop" +# OVERRIDE="false" +``` + +Every variable that is used by the service is configured inside the .guardian/\/configs folder. Because GUARDIAN_ENV is configured as "develop" each service confiiguration are stored in files with format "./guardian/\/configs/.env.\.develop" that follows the template in the same folder. + +Configure the guardian-service + in ./guardian/guardian-service/configs/.env.guardian.develop + +```plaintext +OPERATOR_ID="..." +OPERATOR_KEY="..." +``` + +Configure the worker-service + in ./guardian/worker-service/configs/.env.worker.develop +```plaintext +IPFS_TIMEOUT="720" +IPFS_PROVIDER="web3storage" # 'web3storage' or 'local' +#Single quote IPFS_PUBLIC_GATEWAY +IPFS_PUBLIC_GATEWAY='https://ipfs.io/ipfs/${cid}' +IPFS_STORAGE_API_KEY="..." +IPFS_NODE_ADDRESS="http://ipfs-node:5002" +``` + +## 1) Docker Compose Configuration +----------------------------- +the following configuration will ignore the guardian-service configuration for variables with same name using only the ecosystem configuration while will add the new specific guardian-service variables for newly defined variables like DB_HOST="localhost", DB_DATABASE="guardian_db" etc.. + +### At root level: + +- in ./guardian/.env + +```plaintext +GUARDIAN_ENV="develop" +``` + +- in ./guardian/configs/.env.develop.guardian.system +```plaintext +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# OVERRIDE="false" + +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="testnet" + +# PRE USED HEDERA_NET +# --------------------- +PREUSED_HEDERA_NET="testnet" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +....... +..... + +``` + +### At guardian-service level: + +in file ./guardian/guardian-service/configs/.env.guardian.develop + +```plaintext + HEDERA_NET="localnode" + PREUSED_HEDERA_NET="localnode" + MQ_ADDRESS="localhost" + SERVICE_CHANNEL="guardian.1" + DB_HOST="localhost" + DB_DATABASE="guardian_db" + INITIAL_BALANCE="100" + INITIAL_STANDARD_REGISTRY_BALANCE="100" + + # TESTNET + OPERATOR_ID="0.0.4523185" + OPERATOR_KEY="302e02010030050603.........................05215e7099b30abd63fd1c58bd3c" + INITIALIZATION_TOPIC_ID="0.0.2030" + ``` + + + +### RUN TIME RESULT + +The following environment is loaded by the service. + +```plaintext +HEDERA_NET="testnet" +PREUSED_HEDERA_NET="testnet" +MQ_ADDRESS="message-broker" +SERVICE_CHANNEL="guardian.1" +DB_HOST="mongo" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + + + +## 2) to mantain the same database already in use +--------------------------------------- + +### at root level: + +in ./guardian/.env + +```plaintext +GUARDIAN_ENV="" +``` + +in ./guardian/configs/.env..guardian.system + +```plaintext +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# OVERRIDE="false" + +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="mainnet" + +# PRE USED HEDERA_NET +# --------------------- +PREUSED_HEDERA_NET="mainnet" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +......... +....... + +``` + + + +### at guardian-service level: + + in ./guardian/guardian-service/configs/.env.guardian + +```plaintext +HEDERA_NET="localnode" +PREUSED_HEDERA_NET="localnode" +MQ_ADDRESS="localhost" +SERVICE_CHANNEL="guardian.1" +DB_HOST="localhost" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.4523185" +OPERATOR_KEY="302e02010030050603.........................05215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + + +### RUN TIME RESULT: + +at guardian service level the following environment is loaded at runtime + +```plaintext +HEDERA_NET="mainnet" +PREUSED_HEDERA_NET="mainnet" +MQ_ADDRESS="message-broker" +SERVICE_CHANNEL="guardian.1" +DB_HOST="mongo" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + + +### 3) To use the docker-compose configuration and overriding specific service. +-------------------------------- + +The docker compose file to be used for this alternative is docker-compose_SSV.yaml together with the .env_SSV in the ./configs folder. +Using this configuration both the ecosystem common variables and the service specific variables will be configured in the root folder. using the .env file for specific services variables and the ./config/.env.\.guardian.system for ecosystem variables. + +Follow the steps: + +```plaintext + - backup .env file + $ mv ./.env ./.env_bck + + - copy the .env_SSV file from ./configs. + the .env_SSV file allow to keep not just the GUARDIAN_ENV:guardian environment name but the Specific Service Variables too in a way to let docker compose have visibility at container bootstrap. + $ cp ./configs/.env_SSV ./.env + + - backup docker-compose.yml + $ mv ./docker-compose.yml .docker-compose.bck + + - copy the .docker-compose_SSV.yml in docker.compose.yml + the docker-compose_SSV.yml contains the overriding between the env-files withe the service specific variables in the "environment" attribute per every service + $ cp .docker-compose_SSV.yml in docker.compose.yml + + - run the docker compose without rebuild + $ docker compose up -d +``` + +In this configuration using the default OVERRIDING=false in the .env.\.guardian.system grant that the environments that are in each ./\/configs remain unloaded. \ No newline at end of file diff --git a/docs/environments/data-separation-concerns.md b/docs/environments/data-separation-concerns.md index fc215611b0..9df9ef2560 100644 --- a/docs/environments/data-separation-concerns.md +++ b/docs/environments/data-separation-concerns.md @@ -1,6 +1,6 @@ ### Data level separation of concerns -###### 1694 +###### \#1694 In order to discriminate data stored to the database it has been introduced a different database name per each environment. instead of working on the collection names or introducing new fields in the collection it has been preferred to implement the solution changing the whole database name. In this way different data for the different environments will have his own database. diff --git a/docs/environments/indipendent-services-images.md b/docs/environments/indipendent-services-images.md index d076bf28fe..2ec404a02e 100644 --- a/docs/environments/indipendent-services-images.md +++ b/docs/environments/indipendent-services-images.md @@ -1,9 +1,11 @@ ### Indipendent services images -###### 1604 +###### \#1604 The dockerized services images needs to be indipendent from the environment that describes the context in wich the images itself are running. In each service loading .env files at build time by means of dockerfiles, forces rebuilding the docker image for changes to be applied to the environment. +To prevent this behavior the usage of “env_file” has been Introduced in the docker_compose file. In this way the environment variables are loaded in each container during the bootstrap of the application and passed to the image without the need to rebuild the image itself. +The dockerfiles have been changed accordingly: the command “copy” of the .env file was commented out. Actually the .env file is not needed at build time while it’s going to be charged during the bootstrap of the containers at the compose-level. To prevent this behavior the usage of “env_file” has been Introduced in the docker_compose file. In this way the environment variables are loaded in each container during the bootstrap of the application and passed to the image without the need to rebuild the image itself. The dockerfiles have been changed accordingly: the command “copy” of the .env file was commented out. Actually the .env file is not needed at build time while it’s going to be charged during the bootstrap of the containers at the compose-level. \ No newline at end of file diff --git a/docs/environments/persistance-configuration-according-environment.md b/docs/environments/persistance-configuration-according-environment.md index 2c66c4c4dd..2ead8a51da 100644 --- a/docs/environments/persistance-configuration-according-environment.md +++ b/docs/environments/persistance-configuration-according-environment.md @@ -1,5 +1,5 @@ ### Multi session consistency according to environment -###### 1888, 1696. +###### \#1888, \#1696. Content of data stored during Guardian operative sessions are discriminated according to the environment so that they are always consistent with the data persisted in Hedera Network. This is guaranteed for every operative data and messages exchanged between services that are persisted during different sessions. With the word “session” is intended the time in which the Guardian platform is up and running with the same environment between two different start and stop of the Guardian system. Persisted data during each session regarding transactions both towards Headera net and or Guardian database are easily discriminated in terms of environment and remain consistent with target Hedera network. diff --git a/docs/getting-started/getting-started/installation.md b/docs/getting-started/getting-started/installation.md index ede95fe6b7..20245ea030 100644 --- a/docs/getting-started/getting-started/installation.md +++ b/docs/getting-started/getting-started/installation.md @@ -26,7 +26,7 @@ in `guardian-service/.env.docker`: ``` {% hint style="info" %} -**Note:** +**Note:** 1. You can use the Schema Topic ID (`INITIALIZATION_TOPIC_ID`) already present in the configuration files, or you can specify your own. {% endhint %} @@ -43,7 +43,7 @@ For example: [https://github.com/yeasy/docker-ipfs](https://github.com/yeasy/doc ``` IPFS_NODE_ADDRESS="..." # Default IPFS_NODE_ADDRESS="http://localhost:5002" -IPFS_PUBLIC_GATEWAY="..." # Default IPFS_PUBLIC_GATEWAY="https://localhost:8080/ipfs/${cid}" +IPFS_PUBLIC_GATEWAY='...' # Default IPFS_PUBLIC_GATEWAY='https://localhost:8080/ipfs/${cid}' IPFS_PROVIDER="local" ``` @@ -476,7 +476,7 @@ Once you generated Operator ID and Operator Key, we can either click on Next or **Note**: Restore Data can be restored from Hedera if data is available for setting up the Registry. -
+
{% hint style="info" %} **Limitations on restoring the data:**\ @@ -487,7 +487,7 @@ Once you generated Operator ID and Operator Key, we can either click on Next or If Next is clicked, we need to manually setup the Registry or if Restore Data is clicked, it is filled automatically. -![](<../../.gitbook/assets/image (23) (1).png>) +![](<../../.gitbook/assets/image (14) (3).png>) **Note:** The above fields in UI are mandatory only for this default Schema. diff --git a/docs/guardian/demo-guide/carbon-emissions/atma-ghg-scope-ii-carbon-emission-policy.md b/docs/guardian/demo-guide/carbon-emissions/atma-ghg-scope-ii-carbon-emission-policy.md new file mode 100644 index 0000000000..13c8422bb7 --- /dev/null +++ b/docs/guardian/demo-guide/carbon-emissions/atma-ghg-scope-ii-carbon-emission-policy.md @@ -0,0 +1,74 @@ +--- +description: Policy developed by atma +--- + +# 🏭 atma GHG Scope II Carbon Emission Policy + +## Process Overview + +
+ +## Process description + +This policy supports the calculation of carbon emissions during the production lifecycle stage for one single product based on the measured energy consumption during production at the manufacturing site. + +The calculated GHG emission values are aggregated on a monthly basis and the carbon emission token is minted at the end of each month. + +Emissions calculated: (based on local emissions factors) + +* CO2 +* N2O +* CH4 +* CO2e + +## Limitations + +Currently, only a single product type is supported per policy instance, however, it is possible to instantiate the policy multiple times in order to support multiple different products. + +## Policy Guide + +Once the Policy is imported, you will need to create another user account to be assigned the role of "Organization. Once you are signed in with the new user account, associate with the corresponding tokens, and go into the Policy screen. You will see a drop-down box to select the role of "Organization." + +
+ +
+ +Next, fill out the Organization data form. + +
+ +Once completed, add a new entity by clicking on the "New Entity" button and filling out the New Entity form. + +
+ +
+ +Once the form has been submitted, you'll need to define a product. Click on the "Define Product" button and fill out the product form. + +
+ +
+ +The atma GHG policy issues an NFT token (AtmaProductToken) for every product that has been defined. Once the product has been defined, you can go out of the Policy screen and click over to the Profile screen. There you can click on the "Tokens" tab and notice that the token balance has been increased. + +
+ +Once the product has been defined, you'll need to define the life cycle stage. Click on the "life cycle stage" button and fill out the life cycle stage form. + +
+ +
+ +Once the life cycle for the product has been defined, you now need to record production data. Click on the "production data button" and fill out the production data form. + +
+ +
+ +You can select the "Production Emission Data" tab to view the emissions from the product we just created. + +
+ +Please note that the atma policy has a default "aggregation timer" to mint tokens every month. If you do not customize this option prior to publishing (or running on dry run) you will not see any tokens mint immediately. + +
diff --git a/docs/guardian/demo-guide/carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md b/docs/guardian/demo-guide/carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md index 93e04c1072..aadc13040d 100644 --- a/docs/guardian/demo-guide/carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md +++ b/docs/guardian/demo-guide/carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md @@ -60,7 +60,7 @@ Associate owner with CET (Click on tokens from the nav link and click on the ass After confirming the roles, enter the Project Owner information in the dialog. -
+
## Installer @@ -172,7 +172,7 @@ Click on `Add MRV` and fill up all the values for your MRV Submit MRV then the new MRV will display in the list, Aggregation will run in the background and respect the token mint rule same with realtime data ingression. -
+
{% hint style="info" %} Note: diff --git a/docs/guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/introduction-to-remote-work-ghg.md b/docs/guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/introduction-to-remote-work-ghg.md index bdcb38efed..c92b0dcac8 100644 --- a/docs/guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/introduction-to-remote-work-ghg.md +++ b/docs/guardian/demo-guide/carbon-emissions/remote-work-ghg-policy/introduction-to-remote-work-ghg.md @@ -12,4 +12,4 @@ Heating and cooling energy consumption defaults were calculated based on Energy The workflow begins with each employee completing a survey to help refine their GHG estimates based on location; actual office, heating, and cooling equipment; and other important variables. Based on the responses, a verified credentials (VC) document is created. Then, employees track hours worked and GHG emissions are auto-calculated by customized schemas featuring built-in equations, defaults, and emission factors. Workforce emissions are calculated as the sum of all employee emissions and the resulting emissions are tokenized. -
+
diff --git a/docs/guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md b/docs/guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md index 3b7f6dbf9c..f40ecb1dc8 100644 --- a/docs/guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md +++ b/docs/guardian/demo-guide/carbon-offsets/carbon-reduction-measurement-ghg-corporate-standard-policy-guide.md @@ -2,7 +2,7 @@ description: Policy developed by TYMLEZ --- -# 🧑🌾 Carbon Reduction Measurement - GHG Corporate Standard Policy Guide +# 🧑🌾 Carbon Reduction Measurement - GHG Corporate Standard Policy Guid The setup for the CRU policy is identical to the Carbon Emission Measurement - GHG Corporate Standard policy, please refer to [here](../carbon-emissions/carbon-emissions-measurement-ghg-corporate-standard-policy-guide.md), except for the below steps @@ -12,7 +12,7 @@ The setup for the CRU policy is identical to the Carbon Emission Measurement - G * Open CRU policy * Enter project information -
+
### Sending MRV diff --git a/docs/guardian/demo-guide/carbon-offsets/dovu-methodologies.md b/docs/guardian/demo-guide/carbon-offsets/dovu-methodologies.md index 7897cb60ac..f3ed449ba6 100644 --- a/docs/guardian/demo-guide/carbon-offsets/dovu-methodologies.md +++ b/docs/guardian/demo-guide/carbon-offsets/dovu-methodologies.md @@ -2,7 +2,7 @@ description: AgreCalc and Cool Farm Tool develop by Dovu --- -# 🧑🌾 🧑🌾 Dovu Methodologies +# 🧑🌾 Dovu Methodologies On this page you'll find:​ @@ -27,36 +27,36 @@ The first step towards compliance was building a system to support manual attest 1. We need to download the policy from open source repo and import it by clicking on Import button. -
+
2. Once, imported the policy, you can publish the policy to Hedera by clicking on publish button. 3. Now, we will logout and login as a Registrant role and click on Go on the respective policy: -
+
4. We need to fill the Registrant Application form and click on OK as shown below: For AgreCalc we see below form: -
+
for Cool Farm, we see below form: -
+
5. Once submitted, it is waiting for Standard Registry to approve it. 6. Now we log out and login as Standard Registry, once viewing the registrant documents, we approve the application by clicking on Approve button. 7. Once approved, we again login back as Registrant and submit Farm Registrant form by clicking on Create Farm button: -
+
8. Once filled and clicked on OK, Registrant waits for approval from Standard Registry: -
+
9. Now we login as Standard Registry and click on Farm Projects tab, we can see the Request being submitted by Registrant for Approve/Reject -
+
For testing purpose, we will approve the farm project. @@ -66,16 +66,16 @@ For testing purpose, we will approve the farm project. For Cool Farm Tool methodology, you will see the below request form: -
+
11. Once the Request is submitted, Registrant is waiting for it to be approved by Verifier. 12. Now we logout and login as Verifier, we verify the documents by clicking on approve. -
+
13. Once approved, we login as SR and check the Token History by clicking on Token History Tab: -
+
14. We can also check the TrustChain by clicking on View TrustChain button: diff --git a/docs/guardian/demo-guide/carbon-offsets/gold-standard-afforestation-and-reforestation-ar-v2.0.md b/docs/guardian/demo-guide/carbon-offsets/gold-standard-afforestation-and-reforestation-ar-v2.0.md new file mode 100644 index 0000000000..f69feaacb6 --- /dev/null +++ b/docs/guardian/demo-guide/carbon-offsets/gold-standard-afforestation-and-reforestation-ar-v2.0.md @@ -0,0 +1,121 @@ +--- +description: Policy developed by Envision Blockchain +--- + +# 🌲 Gold Standard Afforestation and Reforestation (AR) v2.0 + +* [Policy Description](gold-standard-afforestation-and-reforestation-ar-v2.0.md#policy-description) +* [Workflow Description](gold-standard-afforestation-and-reforestation-ar-v2.0.md#workflow-description) +* [Policy Guide](gold-standard-afforestation-and-reforestation-ar-v2.0.md#policy-guide) + +**For more Gold Standard Afforestation and Reforestation (AR) policy information, please visit the Envision Blockchain-contributed open-source Guardian policy page** [**here**](https://github.com/hashgraph/guardian/tree/main/Methodology%20Library/GoldStandard/GoldStandard%20AR) + +## **Policy Description**: + +The Gold Standard Afforestation and Reforestation (AR) methodology is a set of guidelines and procedures developed by The Gold Standard Foundation for quantifying and verifying greenhouse gas (GHG) emissions reductions resulting from afforestation and reforestation projects. The methodology provides a standardized framework for calculating the carbon sequestration potential of these types of projects, taking into account removals from both aboveground and belowground tree biomass, and also quantifies emissions from biomass burning for site preparation and the use of nitrogen fertilizer. + +The AR methodology sets out requirements for project design, implementation, and monitoring. It outlines the steps necessary to establish a baseline for GHG emissions and carbon sequestration potential, and to assess the project's impact on local biodiversity. The methodology also includes provisions for addressing potential leakage and permanence risks, which can impact the long-term effectiveness of the project in sequestering carbon. + +The Gold Standard AR methodology promotes sustainable land use practices that contribute to mitigating climate change while supporting the conservation of biodiversity. By providing a standardized framework for evaluating and verifying the carbon sequestration potential of afforestation and reforestation projects, the methodology helps to incentivize the adoption of more sustainable land use practices around the world. + +## **Workflow Description**: + +
+ +## Policy Guide + +Typically, the way we start the demonstration is by logging in as a Standard Registry. + +Create a Standard Registry user if you haven't done so already. + +You'll now be prompted to configure your Standard Registry account. Go through the user profile setup screen. At the last step of the user profile screen, Standard Registry users will need to fill out the Standard Registry attribute form (see screenshot below). Press Connect when finished. This will now initialize the Guardian instance on the correct Hedera Consensus Service Topics, create a DID document, create a Verifiable Credential, etc. + +
+ +Now we will be creating the Policy. Click on the "Policies" tab and select "Policies." We have two ways to create policies. + +For this demo guide, we will use the "Import from Open Source" way. Click on that button and find the policy for this guide and click on the import button. + +Once the policy is imported successfully, you get two options: Publish and Dry Run mode. We select the Dry Run option and select Go. + +
+ +Create additional users by clicking the “Create User” button. + +
+ +Once the users have been created go to each one and assign the appropriate role (i.e. Project Proponent, VVB, Technical Advisory Committee and NGO Supporters). + +
+ +Go to the Standard Registry profile and approve the VVB in the “Approve VVB” tab. + +
+ +Click on the Project Proponent profile and select “New Project”. + +
+ +Now, we can input all the project details and data associated with the project in the “New Project” form. In the schema Excel file, if the final CRU calculations do not result in a positive integer, selecting "Ok" after completing the form will trigger errors. In this demo guide, we have provided a link to an Excel file containing demo values that can be utilized to test the policy. + +
+ +To proceed with the flow, the next step is to access the Standard Registry profile and include the project in the project pipeline. This can be achieved by navigating to the "Project Pipeline" tab and selecting the "Add" option. + +
+ +Next, proceed to the Project Proponent profile and locate the "Projects" section. Then, click on the downward arrow and assign the VVB to the project. + +
+ +After successfully assigning the VVB to the project, the next step is to access the VVB profile and click on the "validate" option located in the Projects tab. + +
+ +To proceed with the workflow, the Standard Registry will validate the project details and schemas. Access the Standard Registry profile and go to the "Project Pipeline" tab. Here, select "Approve" to continue. + +
+ +If you access the Technical Advisory Committee profile, you will find a "Comment" button. You can utilize this button to provide any feedback or comments regarding the project details and schemas. + +
+ +Similarly, you can also leave comments for the NGO Supporters by accessing their profile and selecting the "Comment" button. + +
+ +Navigate back to the Project Proponent profile to complete the monitoring report. In the Projects tab select “Add Report”. + +
+ +Upon selecting "Add Report", a file will open containing the project details and schemas previously filled out. Here, you can update the information based on the relevant monitoring plan provided by the methodology. After updating the information and including a project area map, you may click on "Ok" to proceed. (For this demo, we utilized the same values from the provided Excel file.) + +
+ +Once you have completed the monitoring report, please access the VVB profile and go to the monitoring reports tab. Here, you will find a "Verify" button - select that to proceed. + +
+ +Return to the Standard Registry profile and go to the monitoring reports tab. Here, select "Approve" to proceed. + +After reviewing the monitoring report, the Technical Advisory Committee can provide comments. To do this, access the Technical Advisory Committee profile and go to the monitoring reports tab. Here, select the "Comment" button to proceed. + +
+ +Similarly, you can leave comments for the NGO supporter profile. Navigate to their profile and go to the monitoring reports tab. Here, select the "Comment" button to provide your feedback. + +
+ +This is the final step in the workflow. Access the Standard Registry profile and navigate to the "Monitoring Reports" tab. Here, you will find a "Mint" button - select that to mint the tokens for this monitoring period. + +
+ +By accessing the "Token History" tab, you can view the number of tokens that have been minted. Additionally, clicking on the "View TrustChain" button will allow you to view the TrustChain. + +
+ +The Trust Chain view presents critical elements that are publicly available for discovery, such as token information, policy information, and all the necessary details concerning the Verifiable Credentials comprising the Verifiable Presentation. On the bottom of the screen, you will find "Cards" showcasing the Verifiable Credentials in chronological order. + +
+ +
diff --git a/docs/guardian/demo-guide/carbon-offsets/goldstandard-metered-energy-cooking.md b/docs/guardian/demo-guide/carbon-offsets/goldstandard-metered-energy-cooking.md new file mode 100644 index 0000000000..51141a1f75 --- /dev/null +++ b/docs/guardian/demo-guide/carbon-offsets/goldstandard-metered-energy-cooking.md @@ -0,0 +1,210 @@ +--- +description: Policy developed by Gautam Prajapati during the SBS Hackathon +--- + +# ♨ GoldStandard - Metered Energy Cooking + +### Table of content + +* [Table of content](goldstandard-metered-energy-cooking.md#table-of-content) +* [Introduction](goldstandard-metered-energy-cooking.md#introduction) +* [Why ME\&ED(Metered and Measured Energy) Methodology?](broken-reference/) +* [Demo Video](broken-reference/) +* [Policy Workflow](broken-reference/) +* [Policy Guide](broken-reference/) + * [Available Roles](broken-reference/) + * [Important Documents & Schemas](broken-reference/) + * [Token(Carbon credit)](broken-reference/) + * [Step By Step](broken-reference/) + * [Registry(Gold Standard) Flow](broken-reference/) + * [Project Proponent Flow](broken-reference/) + * [VVB Flow](broken-reference/) +* [Futureproofing(Automated credit issuance)](broken-reference/) +* [TODO](broken-reference/) +* [Existing Cookstove Policy Comparison](broken-reference/) + +### Introduction + +According to [Gold Standard](https://www.goldstandard.org/our-story/sector-community-based-energy-efficiency) more than 3 billion people lack access to clean cooking solutions leading to over 4 million premature deaths each year. This doesn't attribute the havoc GHG emissions from wood or fossil fuel based cookstoves are going to cause in the future. + +According to the 2021 State of the Voluntary Carbon Markets report by Ecosystem Marketplace, improved cookstoves were the second most popular project type in the voluntary carbon market in 2020, accounting for 13% of all carbon offsets transacted. In 2020, cookstove projects generated over 13 million carbon offsets, with an estimated value of $48.6 million USD. The report notes that cookstove projects continue to be popular due to their multiple co-benefits, including improved health outcomes, reduced fuel consumption, and reduced deforestation. + +This Guardian Policy tokenizes the VER(verified emission reduction) after verifying emissions reductions from improved cookstove projects according to Gold standard's methodology for Metered & Measured Energy Cooking Devices (ME\&ED). The methodology is based on the use of energy meters and temperature sensors to collect data on the energy consumption and thermal efficiency of cookstoves, which is then used to calculate the emissions reductions achieved. + +### Why ME\&ED(Metered and Measured Energy) Methodology? + +Carbon offsets from improved cookstove projects help advance Sustainable Development Goals 13 (climate), 7 (energy), 5 (gender), and 3 (health). However, for the carbon offsets generated from these projects to be considered legitimate, methodologies must provide accurate or conservative measurements of the climate impact of these projects. + +Recently, a striking [report](https://www.theguardian.com/environment/2023/jan/18/revealed-forest-carbon-offsets-biggest-provider-worthless-verra-aoe) by The Guardian (media group) exposed the flaws in Verra's REDD+ scheme leading them to [phase out](https://www.theguardian.com/environment/2023/mar/10/biggest-carbon-credit-certifier-replace-rainforest-offsets-scheme-verra-aoe) their methodologies. Such exposures dwindle the stakeholder's sentiment in the carbon markets and hence it is extremely important to build and choose right methodology for carbon projects. + +There are a bunch of improved cookstove methodologies to choose from - + +* [GS-TPDDTEC](https://globalgoals.goldstandard.org/407-ee-ics-technologies-and-practices-to-displace-decentrilized-thermal-energy-tpddtec-consumption/) +* [GS-Simplified](https://globalgoals.goldstandard.org/408-ee-ics-simplified-methodology-for-efficient-cookstoves/) +* [CDM-AMS-II-G](https://cdm.unfccc.int/methodologies/DB/GNFWB3Y6GM4WPXFRR2SXKS9XR908IO) +* [CDM-AMS-I-E](https://cdm.unfccc.int/methodologies/DB/JB9J7XDIJ3298CLGZ1279ZMB2Y4NPQ) +* [GS-Metered-Energy](https://globalgoals.goldstandard.org/news-methodology-for-metered-measured-energy-cooking-devices/) + +According to a new [research](https://assets.researchsquare.com/files/rs-2606020/v1/c2e6a772-b013-49f9-9fc4-8d7d82d4bebc.pdf?c=1678869691) from scholars of University of California, Berkeley - Gold Standard’s Metered and Measured methodology, which directly monitors fuel use, is most aligned with the estimates (only 1.3 times over-credited) and is best suited for fuel switching projects which provide the most abatement potential and health benefit. + +This approach is more precise than traditional methodologies, which rely on more generalized assumptions or estimates to calculate emissions reductions. It also places a strong emphasis on stakeholder engagement and the inclusion of local communities in the project development and monitoring process. This approach promotes greater transparency and accountability and helps to ensure that the environmental and social benefits of the project are maximized. This Guardian policy, is a reflection of same methodology according to the [Gold standard's typical project lifecycle](https://academy.sustain-cert.com/wp-content/uploads/sites/3/2021/10/GS-Project-Cycle\_15042021\_Annyta.pdf). + +### Demo Video + +[Youtube](https://youtu.be/nOQpLmbW0hA) + +### Policy Workflow + +
+ +### Policy Guide + +This policy is published to Hedera network and can either be imported via Github(.policy file) or IPSF timestamp. + +Latest Version - 0.0.3 Hedera Topic - [0.0.3972127](https://explore.lworks.io/testnet/topics/0.0.3972127) + +#### Available Roles + +* Project Proponent - Project developer who proposes and executes cookstove project and receives credits(VER) +* VVB(Validation & Verification Body) - Independent third party who audits project's critical documentation and monitoring reports +* Gold Standard(GS) - GS is the trusted registry overseeing the entire project cycle and issuing the credits(VER) + +#### Important Documents & Schemas + +1. Registry Account Application(RAA) - Account applications to become a project proponent, VVB with registry +2. Project Inception Document (PID) - Preliminary design of project highlighting eligibility, additionality and methodology criteria along with stakeholder consultation report +3. Project Design Document (PDD) - Submitted after PID is approved, detailed report on project execution, emissions calculations and sustainable development goals. +4. Monitoring Report (MR) - Monitoring report contains analysis on cookstove usages on the sample group and estimates carbon avoided/reduced +5. VER Credit Request(VCR) - Requesting specified number of credits into Hedera account +6. Measuring Device - Registering a stove usage IOT device alongside the cookstove for automatic MRs +7. VER Auto Credit Request(VACR) - Requesting automated issuance of credits based on data sent by a measuring device + +#### Token(Carbon credit) + +Verified Emission Reduction(VER) equivalent to 1 ton of CO2 offset + +#### Step By Step + +**Registry(Gold Standard) Flow** + +Registry is allowed to publish and edit policy config, schemas, tokens and all the workflow logic associated with it. They are responsible for approving projects, project proponents, VVBs, and credit issue requests. + +1. Login into the service using registry credentials + +
+ +2. Feel free to play around with policy config by clicking on edit icon and understanding the different schemas used by policy + +
+ +
+ +
+ +3. Registry can review account applications by clicking manage accounts + +
+ +4. Registry can review project inception documents allowing the listing of projects on standard website and trigger project execution on ground. + +
+ +5. Once PDD and MR are approved by VVB, project proponents can submit credit issue requests(VER) which registries have to take decisions on. + +
+ +6. Once VER issue request is approved, an end-to-end trust chain can be viewed by administrator. Since everything is happening transparently on public ledger(Hedera), anyone can trace the source of credits and each step that happened in the process. + +
+ +**Project Proponent Flow** + +1. Complete the sign up form(RAA) to become a project proponent + +
+ +
+ +2. Wait till the application is approved by the registry admin. Once approved, proponents will be able to submit project inception documents. This includes stakeholder consultation report as well. + +
+ +
+ +3. Once project is approved by registry, a detailed PDD(project design document) needs to be submitted. This is the most important document highlighting the technical details of project. It includes calculations around baseline, project and leakage scenarios for accurate calculation of avoided emissions. + +
+ +
+ +4. After PDD approval, project proponent will execute the project on ground and submit regular monitoring reports(MR) + +
+ +5. Once a monitoring report is approved by VVB, project proponent can request corresponding carbon credits(VER in this case) to be credited in their account. It would need a VC document ID for both monitoring report and it's approved review by VVB. + +
+ +
+ +6. Once registry reviews and approves the credit request, they'll be credited into the hedera account provided by project proponent. This is represented by successful minted status. + +
+ +**VVB Flow** + +VVB is the external independent third party responsible for reviewing Project Design Documents and Monitoring reports submitted by proponents. They can comment and reject/request changes as well. + +1. After logging in as VVB, they can view review requests related to project documents. First step is to review PDDs submitted by project proponents. + +
+ +
+ +
+ +2. After PDD approval, proponents will be able to send monitoring reports for review. Once approved, project proponents will be able to claim corresponding VERs. + +
+ +### Future proofing(Automated credit issuance) + +This workflow includes a bonus flow which is a major distinction from other existing policies. Building monitoring reports for cookstove projects is a very manual and error-prone process due to distributed nature of project. Often, a sample group of households are selected to be monitored and results are extrapolated for all the households(in thousands) leading to overcrediting. Since this methodology focuses on having direct measurement devices associated with a stove, an automated way of monitoring is possible. + +
+ +1. Project proponent can register a measuring device associated a given cookstove + +
+ +2. Device can be approved/rejected by the VVB + +
+ +3. Once approved, project developer can raise on-demand credit issuance associated with approved devices. These requests would contain stove fuel usage and temperature data collected automatically by the device + +
+ +
+ +4. After an approval from VVB for the automated monitoring report, VER mint will be initiated in owner account. This will help in faster crediting cycles along with a transparent process for tracking all the intermediate steps. It'll be a huge boost to scaling up the supply of credits in VCM(Voluntary carbon markets). + +### TODO + +This policy was created during a hackathon so there may be couple of bugs here and there and it may not be foolproof. Here are some todos to make it production ready. You can reach out to the policy [author/contributor](https://github.com/gautamp8) for reviewing or reporting issues relevant to this specific policy. + +\[ ] Improve and document list column names for each of the roles, some review IDs are coming as null \[ ] Improve all the schemas(especially PID, PDD). Add support for dynamically selecting fields on basis of fossil fuel or electric device \[ ] Automate emissions calculations on basis of incoming parameters of equations from schemas \[ ] Add Guardian support for list data type in schemas. Helpful for use cases where we're sending device usage data regularly via an API\ +\[ ] Thoroughly test and improve the future proofing IOT device workflow, there are dummy checks and thresholds currently. Schemas need to be updated to accept list of usage parameters. + +### Existing Cookstove Policy Comparison + +Latest version of Guardian provides a policy for [improved cookstoves](https://docs.hedera.com/guardian/guardian/demo-guide/carbon-offsets/improved-cookstove). This new Guardian policy builds on top of it to make it more robust, aligned and future-proof. [Here's a section in demo video](https://youtu.be/nOQpLmbW0hA?t=1318) on differences using policy compare feature provided by Guardian. + +| Features | ME & ED | Improved Cookstove | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -------------------- | +| Follows VCM industry project cycle and terminologies(Verra, Gold Standard) | Yes | No | +| Substantial over crediting possible | No | Yes | +| Critical metrics tracked directly in VC document - Additionality criteria \| Baseline emissions calculation \| Project emissions calculation \| Leakage emissions | Yes \| Yes \| Yes \| Yes | No \| No \| No \| No | +| IOT based monitoring & automated credit issuance | Yes | No | +| Scalable according to future credits demand | Yes | No | +| Exhaustive documentation | Yes | No(incomplete) | diff --git a/docs/guardian/demo-guide/carbon-offsets/improved-cookstove.md b/docs/guardian/demo-guide/carbon-offsets/improved-cookstove.md index 1fe65b5762..c99629f7cd 100644 --- a/docs/guardian/demo-guide/carbon-offsets/improved-cookstove.md +++ b/docs/guardian/demo-guide/carbon-offsets/improved-cookstove.md @@ -40,94 +40,94 @@ We need to first import the policy from open source repository. Once imported, there will be 2 additional users with different roles (aside from the Standard Registry) that need to be created. Create a user account for the Project Developer. Once created and entered into the Policy, select the Project Developer role from the drop-down. -
+
Fill out the Agent Application and wait for the approval. -
+
The next step is to create a user account for the verifier. Once created and entered into the Policy, select the Verifier role from the drop-down. -
+
Fill out the Agent Application to become a verifier and wait for approval. -
+
Now log back into the Standard Registry account and go into the policy. You will notice now two approvals waiting for action. -
+
The next step is for the Project Developer to create a new project. Do this by logging into the Project Developer policy screen, clicking on the "Create new project" button, and filling out the "Project Listing Application" form. -
+
-
+
Logging back into the Standard Registry role, you can see that the Project Listings now has a new review request. -
+
-
+
Now, the Project Developer must go into their screen and "Submit a PDD" and fill out the Project Design Document form. -
+
Now, the Project Developer must go into their screen and "Submit a PDD" and fill out the Project Design Document form. -
+
-
+
The Verifier must now go into their Policy screen and view the PDD by click on the "Review button" and filling out the review form. -
+
After that, the Verifer can select a Review ID and "Finalise review." -
+
Once the PDD has been verified, the Project Developer can "Request registration." -
+
-
+
The Standard Registry can log into their Policy screen, view the incoming Project Registration, and approve it. -
+
Once the Standard Registry approved the Project Developer's Project Registration, the Project Developer can submit the report by clicking on the "Submit MR" button and filling out the form.
-
+
Once the Monitoring Report has been submitted to the Verifier, the Verifier can log into their Policy screen, review it, and fill out the review form. -
+
-
+
The Verifier can submit the Review ID and "Finalise review" -
+
At this point in the methodology workflow, the Project Developer can "request credit issuance" by clicking on the "Request credit issuance button" and filling out the Request ICCC issuance form. -
+
-
+
The Standard Registry can now see the Credit Issuance request and approve it. -
+
Once approved, you can see the Trustchain in the Token History tab of the Standard Registry's policy account. -
+
diff --git a/docs/guardian/demo-guide/carbon-offsets/verra-afforestation-reforestation-and-revegetation-arr-v0.1.md b/docs/guardian/demo-guide/carbon-offsets/verra-afforestation-reforestation-and-revegetation-arr-v0.1.md new file mode 100644 index 0000000000..31545471af --- /dev/null +++ b/docs/guardian/demo-guide/carbon-offsets/verra-afforestation-reforestation-and-revegetation-arr-v0.1.md @@ -0,0 +1,95 @@ +--- +description: Policy developed by Envision Blockchain +--- + +# 🌲 Verra Afforestation, Reforestation, and Revegetation (ARR) v0.1 + +* [Policy Description](verra-afforestation-reforestation-and-revegetation-arr-v0.1.md#policy-description) +* [Workflow Description](verra-afforestation-reforestation-and-revegetation-arr-v0.1.md#workflow-description) +* [Policy Guide](verra-afforestation-reforestation-and-revegetation-arr-v0.1.md#policy-guide) + +**For more Verra Afforestation, Reforestation, and Revegetation (ARR) policy information, please visit the Envision Blockchain-contributed open-source Guardian policy page** [**here**](https://github.com/hashgraph/guardian/tree/main/Methodology%20Library/Verra/Verra%20Redd/VerraARR) + +## **Policy Description**: + +The Verra Afforestation, Reforestation, and Revegetation (ARR) methodology not only quantifies the carbon removal potential of afforestation, reforestation, and revegetation projects, but it also takes into account the emissions resulting from the burning of biomass and the use of nitrogen fertilizer. This comprehensive approach ensures that the net GHG emissions reduction resulting from the project is accurately quantified, verified, and credited. The methodology establishes guidelines for project design, implementation, and monitoring to assess the project's impact on local biodiversity and social and economic conditions, as well as address potential risks. The methodology promotes sustainable land use practices that contribute to mitigating climate change, support the conservation of biodiversity, and incentivize the adoption of more sustainable land use practices. The Verra Afforestation, Reforestation, and Revegetation (ARR) methodology is a newly developed set of guidelines and procedures by Verra for quantifying and verifying greenhouse gas emissions reductions resulting from afforestation, reforestation, and revegetation projects. The methodology is still under development and has not yet been released. + +## **Workflow Description**: + +The workflow begins with the Project Proponent submitting the project description (PD) to Verra. The project description will include ex-ante estimates of the monitoring parameters, as well as other project details to demonstrate alignment with the VCS program requirements. Verra then adds the PD and project docs to the Project Pipeline and Project Registry. Next the Validation and Verification Body (VVB) will assess and validate the PD and provide a Validation Report. Then the Project Proponent will conduct monitoring and develop a Monitoring Report, replacing the ex-ante estimates with ex-post MRV data and submit it to the VVB. The VVB then verifies the Monitoring Report and delivers a Verification Report, Verification Representation, and Verification Statement. Finally, Verra reviews the issuance request and VCUs and are issued to the Project Proponent. + +In future iterations, the workflow will begin with the Project Proponent completing a questionnaire to determine the appropriate methodology, modules, and MRV requirements. Then branch functionality can enable the automatic creation of context-specific schemas. + +Roles in the below Workflow Diagram are represented as follows : Project Proponent (Blue), Verra (Orange), VVB (Green) + +
+ +## Policy Guide + +Typically, the way we start the demonstration is by logging in as a Standard Registry. + +Create a Standard Registry user if you haven't done so already. + +You'll now be prompted to configure your Standard Registry account. Go through the user profile setup screen. At the last step of the user profile screen, Standard Registry users will need to fill out the Standard Registry attribute form (see screenshot below). Press Connect when finished. This will now initialize the Guardian instance on the correct Hedera Consensus Service Topics, create a DID document, create a Verifiable Credential, etc. + +
+ +Now we will be creating the Policy. Click on the "Policies" tab and select "Policies." We have two ways to create policies. + +For this demo guide, we will use the "Import from Open Source" way. Click on that button and find the policy for this guide and click on the import button. + +Once the policy is imported successfully, you get two options: Publish and Dry Run mode. We select the Dry Run option and select Go. + +
+ +Create additional users by clicking the “Create User” button. Once the users have been created go to each one and assign the appropriate role (i.e. Project Proponent and VVB). + +
+ +Go to the Standard Registry profile and approve the VVB in the “Approve VVB” tab. + +
+ +Click on the Project Proponent profile and select “New Project”. + +
+ +Now, we can input all the project details and data associated with the project in the “New Project” form. In the schema Excel file, if the final CRU calculations do not result in a positive integer, selecting "Ok" after completing the form will trigger errors. In this demo guide, we have provided a link to an Excel file containing demo values that can be utilized to test the policy. + +
+ +To proceed with the flow, the next step is to access the Standard Registry profile and include the project in the project pipeline. This can be achieved by navigating to the "Project Pipeline" tab and selecting the "Add" option. + +
+ +Next, proceed to the Project Proponent profile and locate the "Projects" section. Then, click on the downward arrow and assign the VVB to the project. + +
+ +After successfully assigning the VVB to the project, the next step is to access the VVB profile and click on the "validate" option located in the Projects tab. + +
+ +Navigate back to the Project Proponent profile to complete the monitoring report. In the Projects tab select “Add Report”. + +
+ +Upon selecting "Add Report", a file will open containing the project details and schemas previously filled out. Here, you can update the information based on the relevant monitoring plan provided by the methodology. After updating the information and including a project area map, you may click on "Ok" to proceed. (For this demo, we utilized the same values from the provided Excel file.) + +
+ +Once you have completed the monitoring report, please access the VVB profile and go to the monitoring reports tab. Here, you will find a "Verify" button - select that to proceed. + +
+ +This is the final step in the workflow. Access the Standard Registry profile and navigate to the "Monitoring Reports" tab. Here, you will find a "Mint" button - select that to mint the tokens for this monitoring period. + +
+ +By accessing the "Token History" tab, you can view the number of tokens that have been minted. Additionally, clicking on the "View TrustChain" button will allow you to view the TrustChain. + +
+ +The Trust Chain view presents critical elements that are publicly available for discovery, such as token information, policy information, and all the necessary details concerning the Verifiable Credentials comprising the Verifiable Presentation. On the bottom of the screen, you will find "Cards" showcasing the Verifiable Credentials in chronological order. + +
diff --git a/docs/guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md b/docs/guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md index 291e831b41..3598d1fb6e 100644 --- a/docs/guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md +++ b/docs/guardian/demo-guide/carbon-offsets/verra-redd+-demo-guide.md @@ -1,4 +1,4 @@ -# 💻 Verra Redd+ Demo UI Guide +# 💻 Verra Redd VM0007 Demo UI Guide This folder contains a sample file that is referenced in the Demo Usage Guide diff --git a/docs/guardian/demo-guide/carbon-offsets/verra-vm0017-redd+-methodology.md b/docs/guardian/demo-guide/carbon-offsets/verra-vm0017-redd+-methodology.md new file mode 100644 index 0000000000..41d732f8bc --- /dev/null +++ b/docs/guardian/demo-guide/carbon-offsets/verra-vm0017-redd+-methodology.md @@ -0,0 +1,101 @@ +--- +description: Policy developed by Envision Blockchain +--- + +# 🧑🌾 Verra VM0017 REDD+ Methodology + +* [Policy Description](verra-vm0017-redd+-methodology.md#policy-description) +* [Workflow Description](verra-vm0017-redd+-methodology.md#workflow-description) +* [Policy Guide](verra-vm0017-redd+-methodology.md#policy-guide) + +**For more Verra Redd+ VM0017 policy information, please visit the Envision Blockchain-contributed open-source Guardian policy page** [**here**](https://github.com/hashgraph/guardian/tree/main/Methodology%20Library/Verra/Verra%20Redd/VM0017) + +## **Policy Description**: + +The Verra VM0017 methodology is used to measure the emissions reductions that result from sustainable land management in agriculture. VM0017 can be used to monitor the emissions reductions that result from various project activities that increase the amount of carbon stored in agricultural areas. These activities can include the use of cover crops, improved farming techniques, and agroforestry. This methodology can be used in different agricultural regions, but it only applies in situations where the soil organic carbon levels would stay the same or decrease without the project. Currently, there are 26 VM0017 projects listed on Verra’s registry and a total of 10,457,449 (tCO2e) estimated annual emission reductions." + +The workflow is designed to reflect the general roles and processes of the VCS program. The VM0017 REDD is a dynamic modular methodology, and the specific requirements vary depending on the specific project activities and context. The schema was designed to capture the monitoring parameters required for the Avoiding Planned Deforestation (ADP) project type. Projects that involve other project types, and specific contexts, such as projects that involve harvesting commercial timber, may have additional parameter and MRV requirements. + +## **Workflow Description**: + +The workflow begins with the Project Proponent submitting the project description (PD) to Verra. The project description will include ex-ante estimates of the monitoring parameters, as well as other project details to demonstrate alignment with the VCS program requirements. Verra then adds the PD and project docs to the Project Pipeline and Project Registry. Next the Validation and Verification Body (VVB) will assess and validate the PD and provide a Validation Report. Then the Project Proponent will conduct monitoring and develop a Monitoring Report, replacing the ex-ante estimates with ex-post MRV data and submit it to the VVB. The VVB then verifies the Monitoring Report and delivers a Verification Report, Verification Representation, and Verification Statement. Finally, Verra reviews the issuance request and VCUs and are issued to the Project Proponent. + +In future iterations, the workflow will begin with the Project Proponent completing a questionnaire to determine the appropriate methodology, modules, and MRV requirements. Then branch functionality can enable the automatic creation of context-specific schemas. + +Roles in the below Workflow Diagram are represented as follows : Project Proponent (Blue), Verra (Orange), VVB (Green) + +
+ +## Policy Guide + +Typically, the way we start the demonstration is by logging in as a Standard Registry. + +Create a Standard Registry user if you haven't done so already. + +You'll now be prompted to configure your Standard Registry account. Go through the user profile setup screen. At the last step of the user profile screen, Standard Registry users will need to fill out the Standard Registry attribute form (see screenshot below). Press Connect when finished. This will now initialize the Guardian instance on the correct Hedera Consensus Service Topics, create a DID document, create a Verifiable Credential, etc. + +
+ +Now we will be creating the Policy. Click on the "Policies" tab and select "Policies." We have two ways to create policies. + +For this demo guide, we will use the "Import from Open Source" way. Click on that button and find the policy for this guide and click on the import button. + +Once the policy is imported successfully, you get two options: Publish and Dry Run mode. We select the Dry Run option and select Go. + +
+ +Create additional users by clicking the “Create User” button. + +
+ +Once the users have been created go to each one and assign the appropriate role (i.e. Project Proponent and VVB). + +
+ +Go to the Standard Registry profile and approve the VVB in the “Approve VVB” tab. + +
+ +Click on the Project Proponent profile and select “New Project”. + +
+ +Now, we can input all the project details and data associated with the project in the “New Project” form. In the schema Excel file, if the final CRU calculations do not result in a positive integer, selecting "Ok" after completing the form will trigger errors. + +
+ +To proceed with the flow, the next step is to access the Standard Registry profile and include the project in the project pipeline. This can be achieved by navigating to the "Project Pipeline" tab and selecting the "Add" option. + +
+ +Next, proceed to the Project Proponent profile and locate the "Projects" section. Then, click on the downward arrow and assign the VVB to the project. + +
+ +After successfully assigning the VVB to the project, the next step is to access the VVB profile and click on the "validate" option located in the Projects tab. + +
+ +Navigate back to the Project Proponent profile to complete the monitoring report. In the Projects tab select “Add Report”. + +
+ +Upon selecting "Add Report", a file will open containing the project details and schemas previously filled out. Here, you can update the information based on the relevant monitoring plan provided by the methodology. After updating the information and including a project area map, you may click on "Ok" to proceed. + +Once you have completed the monitoring report, please access the VVB profile and go to the monitoring reports tab. Here, you will find a "Verify" button - select that to proceed. + +
+ +This is the final step in the workflow. Access the Standard Registry profile and navigate to the "Monitoring Reports" tab. Here, you will find a "Mint" button - select that to mint the tokens for this monitoring period. + +
+ +By accessing the "Token History" tab, you can view the number of tokens that have been minted. Additionally, clicking on the "View TrustChain" button will allow you to view the TrustChain. + +
+ +The Trust Chain view presents critical elements that are publicly available for discovery, such as token information, policy information, and all the necessary details concerning the Verifiable Credentials comprising the Verifiable Presentation. On the bottom of the screen, you will find "Cards" showcasing the Verifiable Credentials in chronological order. + +
+ +
diff --git a/docs/guardian/demo-guide/carbon-offsets/verra-vm0042-redd+-methodology.md b/docs/guardian/demo-guide/carbon-offsets/verra-vm0042-redd+-methodology.md new file mode 100644 index 0000000000..0460b2f755 --- /dev/null +++ b/docs/guardian/demo-guide/carbon-offsets/verra-vm0042-redd+-methodology.md @@ -0,0 +1,99 @@ +--- +description: Policy developed by Envision Blockchain +--- + +# 🧑🌾 Verra VM0042 REDD+ Methodology + +* [Policy Description](verra-vm0042-redd+-methodology.md#policy-description) +* [Workflow Description](verra-vm0042-redd+-methodology.md#workflow-description) +* [Policy Guide](verra-vm0042-redd+-methodology.md#policy-guide) + +**For more Verra VM0042 REDD+ Methodology policy information, please visit the Envision Blockchain-contributed open-source Guardian policy page** [**here**](https://github.com/hashgraph/guardian/tree/main/Methodology%20Library/Verra/Verra%20Redd/VM0042) + +## **Policy Description**: + +The Verra VM0042 methodology is used to calculate the emissions reductions and carbon storage increases that result from using improved land management practices in agriculture. It takes into account emissions from fossil fuel combustion, manure deposition, biomass burning, and nitrogen fertilizers. Improved land management practices can include reducing the use of fertilizers and tillage, improving water management, managing crop residue, planting, and harvesting cover crops, and improving grazing practices. Currently, there are 35 VM0042 projects listed on Verra’s registry and a total of 21,722,438 (tCO2e) estimated annual emission reductions. + +## **Workflow Description**: + +The workflow begins with the Project Proponent submitting the project description (PD) to Verra. The project description will include ex-ante estimates of the monitoring parameters, as well as other project details to demonstrate alignment with the VCS program requirements. Verra then adds the PD and project docs to the Project Pipeline and Project Registry. Next the Validation and Verification Body (VVB) will assess and validate the PD and provide a Validation Report. Then the Project Proponent will conduct monitoring and develop a Monitoring Report, replacing the ex-ante estimates with ex-post MRV data and submit it to the VVB. The VVB then verifies the Monitoring Report and delivers a Verification Report, Verification Representation, and Verification Statement. Finally, Verra reviews the issuance request and VCUs and are issued to the Project Proponent. + +In future iterations, the workflow will begin with the Project Proponent completing a questionnaire to determine the appropriate methodology, modules, and MRV requirements. Then branch functionality can enable the automatic creation of context-specific schemas. + +Roles in the below Workflow Diagram are represented as follows : Project Proponent (Blue), Verra (Orange), VVB (Green) + +
+ +## Policy Guide + +Typically, the way we start the demonstration is by logging in as a Standard Registry. + +Create a Standard Registry user if you haven't done so already. + +You'll now be prompted to configure your Standard Registry account. Go through the user profile setup screen. At the last step of the user profile screen, Standard Registry users will need to fill out the Standard Registry attribute form (see screenshot below). Press Connect when finished. This will now initialize the Guardian instance on the correct Hedera Consensus Service Topics, create a DID document, create a Verifiable Credential, etc. + +
+ +Now we will be creating the Policy. Click on the "Policies" tab and select "Policies." We have two ways to create policies. + +For this demo guide, we will use the "Import from Open Source" way. Click on that button and find the policy for this guide and click on the import button. + +Once the policy is imported successfully, you get two options: Publish and Dry Run mode. We select the Dry Run option and select Go. + +
+ +Create additional users by clicking the “Create User” button. + +
+ +Once the users have been created go to each one and assign the appropriate role (i.e. Project Proponent and VVB). + +
+ +Go to the Standard Registry profile and approve the VVB in the “Approve VVB” tab. + +
+ +Click on the Project Proponent profile and select “New Project”. + +
+ +Now, we can input all the project details and data associated with the project in the “New Project” form. In the schema Excel file, if the final CRU calculations do not result in a positive integer, selecting "Ok" after completing the form will trigger errors. + +
+ +To proceed with the flow, the next step is to access the Standard Registry profile and include the project in the project pipeline. This can be achieved by navigating to the "Project Pipeline" tab and selecting the "Add" option. + +
+ +Next, proceed to the Project Proponent profile and locate the "Projects" section. Then, click on the downward arrow and assign the VVB to the project. + +
+ +After successfully assigning the VVB to the project, the next step is to access the VVB profile and click on the "validate" option located in the Projects tab. + +
+ +Navigate back to the Project Proponent profile to complete the monitoring report. In the Projects tab select “Add Report”. + +
+ +Upon selecting "Add Report", a file will open containing the project details and schemas previously filled out. Here, you can update the information based on the relevant monitoring plan provided by the methodology. After updating the information and including a project area map, you may click on "Ok" to proceed. + +
+ +Once you have completed the monitoring report, please access the VVB profile and go to the monitoring reports tab. Here, you will find a "Verify" button - select that to proceed. + +
+ +This is the final step in the workflow. Access the Standard Registry profile and navigate to the "Monitoring Reports" tab. Here, you will find a "Mint" button - select that to mint the tokens for this monitoring period. + +
+ +By accessing the "Token History" tab, you can view the number of tokens that have been minted. Additionally, clicking on the "View TrustChain" button will allow you to view the TrustChain. + +
+ +The Trust Chain view presents critical elements that are publicly available for discovery, such as token information, policy information, and all the necessary details concerning the Verifiable Credentials comprising the Verifiable Presentation. On the bottom of the screen, you will find "Cards" showcasing the Verifiable Credentials in chronological order. + +
diff --git a/docs/guardian/demo-guide/renewable-energy-credits/demo-using-apis.md b/docs/guardian/demo-guide/renewable-energy-credits/demo-using-apis.md index 4f2f1b9587..4dee9d03e6 100644 --- a/docs/guardian/demo-guide/renewable-energy-credits/demo-using-apis.md +++ b/docs/guardian/demo-guide/renewable-energy-credits/demo-using-apis.md @@ -701,7 +701,7 @@ capacity ![](../../../.gitbook/assets/Sensor.png) -
+
### 3.4 Refresh the Blocks diff --git a/docs/guardian/readme/environments/ecosystem-environments.md b/docs/guardian/readme/environments/ecosystem-environments.md new file mode 100644 index 0000000000..01876e4756 --- /dev/null +++ b/docs/guardian/readme/environments/ecosystem-environments.md @@ -0,0 +1,240 @@ +# Ecosystem Environments + +The set of environment parameters represent the context in which a service is executed. Each service needs to know this context to adapt its behavour to the real working condition. At the service level the node .env library allows to read environment of the kind \ this library by default reads from .env file. The data are reads in a process .environment data structure available in the execution context of Node process. A unique file defines the environment and keeps the responsibility to create the shared operative ecosystem. + +All Guardian Micro-services share a common set of Environment variables. In this way, Guardian can be seen as an ecosystem with several services and common set of parameters leading his behavour. This environment parameters are shared between all the services of the Guardian ecosystem. All variables are defined in a ".env.\.guardian.system" file. The file name is parametric so it is possible to define a different files for different possible running configuration, for example production, develop, test1. The ecosystem environment file follow the .env.template.guardian.system file that let write new configurations with the set of necessary variables. Both the template file and the resulting environments files are in the folder "./configs/", they can be discriminated by its name to spread the session. + +The parameter GUARDIAN\_ENV is defined univocally in an .env file. The containers orchestration will be responsible to push the environment in to the container in a way the environment will be available to the Node server. For example in the execution of Guardian using docker compose tool the tool inject the environment in each container. Docker compose push the environment in the container by the means of the env-file attribute and the environment attribute. Over more the environment attribute can be parametrized by variables defined in a ".env" file located next to the docker\_compose.yaml. + + + +
+ +Also Guardian services are allowed to define specific service variables. This different set of variables allow to have a hierarchical definition of the same variable in a way that a developer could redefine some of them in a service specific way or add new variables extending the usage of the ecosystem environment. The environment variables that are specific to services can be specified by the means of .env.\.\ files in each service. + +Per each installed service the environment is configured using the two file: + +1. ".env" file +2. "./guardian/\/configs/.env.\.develop" file + +The environment is loaded in the service by the file config.ts. The Environment is read in two steps: at first steps the service .env file is loaded by Node while at second step ".env.\.\" file is loaded. A new environment variable OVERRIDE as "true"/"false" it has been added to let variables defined in the ".env.\.\.\" to override the common defined variables or add new ones. For example If OVERRIDE=true a variable with the same name as the one already defined in the ".env"" file will assume the value specify at service level. The OVERRIDE parameter is not mandatory. if OVERRIDE="false" (default value) specific service variables can only be added to the global ones. In each service a new "./configs" folder holds the set of parametric service level environment files. + +With this implementation, the service orchestrator can push not just the ecosystem environment but the service specific variables too or leave the service specific variables under the responsibility of the service itself. + +For example it is possible to use docker compose to orchestrate the service in a single node. Docker compose has “env-file” and “environment” attributes to define environment. There is a precedence between this two attributes as define at [https://docs.docker.com/compose/environment-variables/envvars-precedence/#simple-example](https://docs.docker.com/compose/environment-variables/envvars-precedence/#simple-example). In this way override=”true” always and variables re-assigned in the environment attributes override what has been defined in the .env.\.guardian.system env-file. + +### EXAMPLES: + +### Configure each service without an orchestrator + +Configure .env, in ./guardian/\/.env. Insert the variable GUARDIAN\_ENV and give it the name that you choose for you Guardian platform environment (production, develop ...). If you update a production environment to keep working with your previous data leave the field GUARDIAN\_ENV="" empty. + +The OVERRIDE variable is not mandatory and it default to "false". + +``` +GUARDIAN_ENV="develop" +# OVERRIDE="false" +``` + +Every variable that is used by the service is configured inside the .guardian/\/configs folder. Because GUARDIAN\_ENV is configured as "develop" each service configuration are stored in files with format "./guardian/\/configs/.env.\.develop" that follows the template in the same folder. + +Configure the guardian-service in ./guardian/guardian-service/configs/.env.guardian.develop + +``` +OPERATOR_ID="..." +OPERATOR_KEY="..." +``` + +Configure the worker-service in ./guardian/worker-service/configs/.env.worker.develop + +``` +IPFS_TIMEOUT="720" +IPFS_PROVIDER="web3storage" # 'web3storage' or 'local' +#Single quote IPFS_PUBLIC_GATEWAY +IPFS_PUBLIC_GATEWAY='https://ipfs.io/ipfs/${cid}' +IPFS_STORAGE_API_KEY="..." +IPFS_NODE_ADDRESS="http://ipfs-node:5002" +``` + +### 1) Docker Compose Configuration + +The following configuration will ignore the guardian-service configuration for variables with same name using only the ecosystem configuration while will add the new specific guardian-service variables for newly defined variables like DB\_HOST="localhost", DB\_DATABASE="guardian\_db" etc.. + +#### At root level: + +* in ./guardian/.env + +``` +GUARDIAN_ENV="develop" +``` + +* in ./guardian/configs/.env.develop.guardian.system + +``` +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# OVERRIDE="false" + +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="testnet" + +# PRE USED HEDERA_NET +# --------------------- +PREUSED_HEDERA_NET="testnet" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +....... +..... + +``` + +#### At Guardian-service level: + +in file ./guardian/guardian-service/configs/.env.guardian.develop + +``` + HEDERA_NET="localnode" + PREUSED_HEDERA_NET="localnode" + MQ_ADDRESS="localhost" + SERVICE_CHANNEL="guardian.1" + DB_HOST="localhost" + DB_DATABASE="guardian_db" + INITIAL_BALANCE="100" + INITIAL_STANDARD_REGISTRY_BALANCE="100" + + # TESTNET + OPERATOR_ID="0.0.4523185" + OPERATOR_KEY="302e02010030050603.........................05215e7099b30abd63fd1c58bd3c" + INITIALIZATION_TOPIC_ID="0.0.2030" +``` + +#### RUN TIME RESULT + +The following environment is loaded by the service. + +``` +HEDERA_NET="testnet" +PREUSED_HEDERA_NET="testnet" +MQ_ADDRESS="message-broker" +SERVICE_CHANNEL="guardian.1" +DB_HOST="mongo" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + +### 2) To maintain the same database already in use + +#### At root level: + +in ./guardian/.env + +``` +GUARDIAN_ENV="" +``` + +in ./guardian/configs/.env..guardian.system + +``` +# ECOSYSTEM ENVIRONMENT VARIABLES AND FEATURES + +# OVERRIDE - default "false" +# --------------------------- +# OVERRIDE="false" + +# HEDERA_NET - MANDATORY +# ------------------------ +HEDERA_NET="mainnet" + +# PRE USED HEDERA_NET +# --------------------- +PREUSED_HEDERA_NET="mainnet" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +......... +....... + +``` + +#### At Guardian-service level: + +``` +in ./guardian/guardian-service/configs/.env.guardian +``` + +``` +HEDERA_NET="localnode" +PREUSED_HEDERA_NET="localnode" +MQ_ADDRESS="localhost" +SERVICE_CHANNEL="guardian.1" +DB_HOST="localhost" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.4523185" +OPERATOR_KEY="302e02010030050603.........................05215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + +#### RUN TIME RESULT: + +At Guardian service level the following environment is loaded at runtime + +``` +HEDERA_NET="mainnet" +PREUSED_HEDERA_NET="mainnet" +MQ_ADDRESS="message-broker" +SERVICE_CHANNEL="guardian.1" +DB_HOST="mongo" +DB_DATABASE="guardian_db" +INITIAL_BALANCE="100" +INITIAL_STANDARD_REGISTRY_BALANCE="100" + +# TESTNET +OPERATOR_ID="0.0.3422318" +OPERATOR_KEY="302e020100300506032b6570042..................34c805215e7099b30abd63fd1c58bd3c" +INITIALIZATION_TOPIC_ID="0.0.2030" +``` + +### 3) To use the docker-compose configuration and overriding specific service + +The docker compose file to be used for this alternative is docker-compose\_SSV.yaml together with the .env\_SSV in the ./configs folder. Using this configuration both the ecosystem common variables and the service specific variables will be configured in the root folder. using the .env file for specific services variables and the ./config/.env.\.guardian.system for ecosystem variables. + +Follow the steps: + +``` + - backup .env file + $ mv ./.env ./.env_bck + + - copy the .env_SSV file from ./configs. + the .env_SSV file allow to keep not just the GUARDIAN_ENV:guardian environment name but the Specific Service Variables too in a way to let docker compose have visibility at container bootstrap. + $ cp ./configs/.env_SSV ./.env + + - backup docker-compose.yml + $ mv ./docker-compose.yml .docker-compose.bck + + - copy the .docker-compose_SSV.yml in docker.compose.yml + the docker-compose_SSV.yml contains the overriding between the env-files withe the service specific variables in the "environment" attribute per every service + $ cp .docker-compose_SSV.yml in docker.compose.yml + + - run the docker compose without rebuild + $ docker compose up -d +``` + +In this configuration using the default OVERRIDING=false in the .env.\.guardian.system grant that the environments that are in each ./\/configs remain unloaded. diff --git a/docs/guardian/readme/getting-started/how-to-change-explorer-url.md b/docs/guardian/readme/getting-started/how-to-change-explorer-url.md index d0cd624a77..c5730929b7 100644 --- a/docs/guardian/readme/getting-started/how-to-change-explorer-url.md +++ b/docs/guardian/readme/getting-started/how-to-change-explorer-url.md @@ -2,7 +2,7 @@ To make changes in the Explorer, we need to change some parameters in environment settings on UI. explorerSettings, which contains url (with network, type, value variables) , networkMap, typeMap (networkMap and typeMap helps to resolve api path on different explorers) as shown: -
+
As we see the above demonstrates setting of Ledger Works explorer. diff --git a/docs/guardian/readme/guardian-vault.md b/docs/guardian/readme/guardian-vault.md index 15b17646d0..80705c16f9 100644 --- a/docs/guardian/readme/guardian-vault.md +++ b/docs/guardian/readme/guardian-vault.md @@ -4,11 +4,11 @@ Guardian Vault is intended to provide supports in securely storing sensitive dat Although Cloud infrastructures like Google, Azure and AWS offer secure Secret Manager Service to make the configuration very simple without the burden of deployment process, there are on-premise native technologies such as Hashicorp Vault that provide Cloud Agnostic solutions. Currently, Guardian supports **AWS Secrets Manager** and **Hashicorp Vault** as its core secrets manager. -
+
In the current Architecture, each service has permission to read/write/update secrets directly instead of handling operations through a central service like Auth Service. Secrets are considered as resources and categorized into different divisions and according to categories and subcategories Policies are created and consequently based on need-to-know basis principal roles per services with essential policies are generated in order that each service is assigned permissions that it requires to access the secrets. As an example, Auth Service does not need to know anything about the user wallets, but only requires access to auth secret key. -
+
As expected in production all connections between vault and services are secured by TLS communication. Communication with AWS Secrets Manager is handled within a private network. diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact-1.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact-1.md new file mode 100644 index 0000000000..32d2354f0a --- /dev/null +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact-1.md @@ -0,0 +1,51 @@ +# (deprecated) Delete Artifact + + + +{% swagger method="delete" path="" baseUrl="/artifact/{artifactId}" summary="Delete artifact." %} +{% swagger-description %} +Delete artifact. +{% endswagger-description %} + +{% swagger-parameter in="path" name="artifactID" type="String" required="true" %} +Artifact identifier +{% endswagger-parameter %} + +{% swagger-response status="204: No Content" description="No Content" %} +```javascript +{ + content: + application/json: + schema: + type: boolean +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact.md index ec991daa90..b19ff0f821 100644 --- a/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact.md +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/delete-artifact.md @@ -1,6 +1,6 @@ # Delete Artifact -{% swagger method="delete" path="" baseUrl="/artifact/{artifactId}" summary="Delete artifact." %} +{% swagger method="delete" path="" baseUrl="/artifacts/{artifactId}" summary="Delete artifact." %} {% swagger-description %} Delete artifact. {% endswagger-description %} @@ -9,7 +9,7 @@ Delete artifact. Artifact identifier {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="204: No Content" description="No Content" %} ```javascript { content: diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts-1.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts-1.md new file mode 100644 index 0000000000..eee88f6b3c --- /dev/null +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts-1.md @@ -0,0 +1,65 @@ +# (deprecated) Returns all Artifacts + +{% swagger method="get" path="" baseUrl="/artifact" summary="Returns all artifacts." %} +{% swagger-description %} +Returns all artifacts. +{% endswagger-description %} + +{% swagger-parameter in="query" name="policyID" type="String" required="true" %} +Policy Identifier +{% endswagger-parameter %} + +{% swagger-parameter in="query" name="pageIndex" type="Integer" required="true" %} +The number of pages to skip before starting to collect the result set +{% endswagger-parameter %} + +{% swagger-parameter in="query" name="pageSize" type="Integer" required="true" %} +The numbers of items to return +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} +```javascript +{ + headers: + x-total-count: + schema: + type: integer + description: Total items in the collection. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Artifact' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} + diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts.md index 8894ed2d03..74cf2553b6 100644 --- a/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts.md +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/returns-all-artifacts.md @@ -1,6 +1,6 @@ # Returns all Artifacts -{% swagger method="get" path="" baseUrl="/artifact" summary="Returns all artifacts." %} +{% swagger method="get" path="" baseUrl="/artifacts" summary="Returns all artifacts." %} {% swagger-description %} Returns all artifacts. {% endswagger-description %} @@ -62,3 +62,4 @@ The numbers of items to return ``` {% endswagger-response %} {% endswagger %} + diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts-1.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts-1.md new file mode 100644 index 0000000000..d183cba7cf --- /dev/null +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts-1.md @@ -0,0 +1,75 @@ +# (deprecated) Upload Artifacts + +{% swagger method="post" path="" baseUrl="/artifact/{policyId}" summary="Upload Artifact" expanded="false" %} +{% swagger-description %} +Upload artifact. For users with the Standard Registry role only. +{% endswagger-description %} + +{% swagger-parameter in="body" name="schema" type="Object" required="true" %} + +{% endswagger-parameter %} + +{% swagger-parameter in="body" name="artifacts" type="Array" required="true" %} + +{% endswagger-parameter %} + +{% swagger-parameter in="body" name="items" type="String" required="true" %} + +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="policyID" type="String" required="true" %} +Policy Identifier +{% endswagger-parameter %} + +{% swagger-response status="201: Created" description="Created" %} +```javascript +{ + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Artifact' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +There are no files to upload +``` + +``` +There is no appropriate policy or policy is not in DRAFT status +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts.md b/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts.md index c635750843..5b37ce74cf 100644 --- a/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts.md +++ b/docs/guardian/standard-registry/artifacts/artifacts-apis/upload-artifacts.md @@ -1,6 +1,6 @@ # Upload Artifacts -{% swagger method="post" path="" baseUrl="/artifact/{policyId}" summary="Upload Artifact" %} +{% swagger method="post" path="" baseUrl="/artifacts/{policyId}" summary="Upload Artifact" expanded="false" %} {% swagger-description %} Upload artifact. For users with the Standard Registry role only. {% endswagger-description %} @@ -21,7 +21,7 @@ Upload artifact. For users with the Standard Registry role only. Policy Identifier {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { content: @@ -50,6 +50,18 @@ Policy Identifier ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +There are no files to upload +``` + +``` +There is no appropriate policy or policy is not in DRAFT status +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/guardian/standard-registry/mobile-support-for-data-interface/mobile-operation-for-the-standard-registry.md b/docs/guardian/standard-registry/mobile-support-for-data-interface/mobile-operation-for-the-standard-registry.md index f38e23e1a6..a8091e64c9 100644 --- a/docs/guardian/standard-registry/mobile-support-for-data-interface/mobile-operation-for-the-standard-registry.md +++ b/docs/guardian/standard-registry/mobile-support-for-data-interface/mobile-operation-for-the-standard-registry.md @@ -11,7 +11,7 @@ Here the images below to show the selection of account type and selection of use
-
+
@@ -59,7 +59,7 @@ The importing of policies was also adapted from the click on the "Import" button Below you can see the preview of the imported policy -
+
diff --git a/docs/guardian/standard-registry/policies/demo-on-integrating-external-policies-using-ui.md b/docs/guardian/standard-registry/policies/demo-on-integrating-external-policies-using-ui.md new file mode 100644 index 0000000000..ea2fe7bea7 --- /dev/null +++ b/docs/guardian/standard-registry/policies/demo-on-integrating-external-policies-using-ui.md @@ -0,0 +1,25 @@ +# 💻 Demo on Integrating external policies using UI + +Here are the following steps to Integrate external policies as data sources: + +1. Need to enter topicId, for which needs to be integrated to the policy: + +
+ +2. Once the topicID is entered, second step is to display the policy information associated with the entered topic. + +
+ +3. Once, policy information is reviewed and confirmed, third step is to select the schemas/documents from the policy to be integrated. + +
+ +4. This is the final step which confirms the linking of the policies via their documents. + +
+ +{% hint style="info" %} +**Note:** Documents between the policies are synchronized automatically. Additionally, it can also be synched by clicking on sync button as shown below: +{% endhint %} + +
diff --git a/docs/guardian/standard-registry/policies/demo-on-policy-wizard-using-ui.md b/docs/guardian/standard-registry/policies/demo-on-policy-wizard-using-ui.md new file mode 100644 index 0000000000..3793085e1c --- /dev/null +++ b/docs/guardian/standard-registry/policies/demo-on-policy-wizard-using-ui.md @@ -0,0 +1,91 @@ +# 💻 Demo on Policy Wizard using UI + +There are two ways to open Policy Wizard: + +1. Click on Policy Wizard button from Policies Tab as shown below: + +
+ +2. Open from the Policy Configurator page: + +
+ +## 4 step process to complete Policy Wizard: + +### Policy Description: + +This step allows users to setup policy information such as name, description, policy tag and topic description. + +
+ +### Policy Roles: + +This step provides facilities to manage policy roles. Created Roles can be deleted by clicking on them. + +{% hint style="info" %} +**Note:** Owner is the default policy role (Policy Owner) and cannot be deleted. +{% endhint %} + +
+ +### 3. Policy Schemas + +This step allows facilities to manage schemas in the policy by selecting schemas in the dropdown. + +#### 3.1 {schema} configuration + +
+ +At this stage users set roles which are able to view the document grid. Additionally they can set the _produced schema_ to configure _produced schema_ creation based on the current schema. + +**Relationship schema** defines documents which will be placed in the relationships in the current schema (after creation). + +**Initial for roles** field defines which roles will see this schema (instead of displaying grid immediately) after role choosing. + +If **Approve and Reject** and **Minting tokens** are set to _enable_ the corresponding functions by this schema would be enabled. This additionally required to specify the token and the field in schema to be used in the minting rule. + +{% hint style="info" %} +Note: We can select multiple schemas by entering the schemas names separated by a delimiter: ",". +{% endhint %} + +
+ +#### 3.1.1 {role} configuration + +
+ +This step allows: + +1. To set _approver_ (only if _Approve and Reject functionality_ is enabled) +2. _creator_ flags for the selected role. +3. Also allows to select _grid columns_ (ordering is supported). + +### 4. TrustChain + +
+ +This step allows to set up users which are able to view grids with VPs and the grid with the trust chain. + +#### 4.1. {role} configuration + +
+ +In this step, Users can choose a minting schema which will be displayed on the trust chain. Additionally, visibility for VPs can be configured to ‘only own ‘ (recommended for the roles other than OWNER) or to ‘all’. + +## Save/Recovery Process + +After the policy in the wizard is configured, users can click on ‘Create’ and thereby save the progress of the wizard configuration to be able to restore it later. + +
+ +{% hint style="info" %} +**Note:** + +1. If ‘Cancel' is clicked, then the wizard progress will be removed. +2. Progress will be automatically removed when policy is published. +{% endhint %} + +Next time, when the wizard is opened a dialog with the selector of wizard states would be displayed, where we can select respective policy and restore progress. + +
+ diff --git a/docs/guardian/standard-registry/policies/introduction/externaltopicblock.md b/docs/guardian/standard-registry/policies/introduction/externaltopicblock.md new file mode 100644 index 0000000000..ae0af45906 --- /dev/null +++ b/docs/guardian/standard-registry/policies/introduction/externaltopicblock.md @@ -0,0 +1,81 @@ +# externalTopicBlock + +This block allows to configure the link to Hedera topics established by other policy instances for monitoring of ‘document published’ messages and ingestion of the targeted VC documents. + +
+ +## 1.1 Properties + +| Property Name | Description | Example | Status | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------ | ------ | +| Tag | Unique name for the logic block. | externalTopic | | +| Permissions | Which entity has rights to interact at this part of the workflow. | Standard Registry | | +| Default Active | Shows whether this block is active at this time and whether it needs to be shown. | Checked or Unchecked | | +| Stop Propagation | End processing here, don't pass control to the next block. | Checked or Unchecked | | +| On Errors | Called if the system error has occurs in the Block |

- No action
- Retry

| | +| Schema | a schema containing the minimal structure/content requirements for the VC documents to comply with in order to be ingested from the topic. A compliant document can be a super set of the minimal schema, i.e. it can contain other properties/data so long as it also has what is specified in this schema. | Schema | | + +## 1.2 Data Format + +### 1.2.1 GET + +``` +{ + documentTopicId – topic which contains links to documents to be ingested (optional/required depending on the stage in the workflow) + policyTopicId – topic which contains policy messages (optional/required depending on the stage in the workflow) + instanceTopicId – topic which contains policy instance specific messages (optional/required depending on the stage in the workflow) + documentMessage – message with the information about the document topic(documentTopicId) + policyMessage – message with the information about the policy topic(policyTopicId) + policyInstanceMessage – message with the information about the policy instance topic(instanceTopicId) + schemas – schemas accessible in the select policy (if specified) + schema – schema which was selected by the user + lastUpdate – time stamp of the last synchronisation + status – link status +} + +``` + +### 1.2.2 POST + +* **Topic selection** – allow the user to specify the topic which contains messages about the documents to be ingested. + +``` +{ + "operation": "SetTopic", + "value": "topicId" +} +``` + +* **Schema selection** – allows the user to specify the schema for selecting (filtering) the documents to be ingested. + +``` +{ + "operation": "SetSchema", + "value": "schemaId" +} +``` + +* **Schema verification** – verifies if the selected schema is compliant with the settings of the block + +``` +{ + "operation": "VerificationSchema", + "value": "schemaId" +} +``` + +* **Manual loading of the documents** – triggers immediate (out of schedule) synchronization of the documents (the automatic synchronization will still takes place as per the schedule) + +``` +{ + "operation": "VerificationSchemas", +} +``` + +* **Reset of the link** – allows to reset settings and specify afresh. + +``` +{ + "operation": "Restart", +} +``` diff --git a/docs/guardian/standard-registry/policies/introduction/impactaddon.md b/docs/guardian/standard-registry/policies/introduction/impactaddon.md index f3b1aa49e4..8d2c44a06d 100644 --- a/docs/guardian/standard-registry/policies/introduction/impactaddon.md +++ b/docs/guardian/standard-registry/policies/introduction/impactaddon.md @@ -4,18 +4,7 @@ This Addon for the mint block which allows to add additional info for the token ### 1. Properties -| Property Name | Description | Example | Status | -| ---------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ------ | -| Tag | Unique name for the logic block. | impactAddon\_1 | | -| Permissions | Which entity has rights to interact at this part of the workflow. | Standard Registry | | -| Default Active | Shows whether this block is active at this time and whether it needs to be shown. | Checked or UnChecked | | -| Stop Propagation | End processing here, don't pass control to the next block. | Checked or UnChecked | | -| On Errors | Called if the system error has occurs in the Block |
  • No action
  • Retry
  • Go to step
  • Go to tag
| | -| Impact Type | shows the type of the impact | Primary Impacts / Secondary Impacts | | -| Label | Title of the Impact | Test | | -| Description | Description of the impact | Impact description | | -| Amount (Formula) | Formula for calculating the impact quantitative representation based on the data from the source VC | field0 | | -| Unit | Unit of measurement of impact amounts | Kg | | +
Property NameDescriptionExampleStatus
TagUnique name for the logic block.impactAddon_1
PermissionsWhich entity has rights to interact at this part of the workflow.Standard Registry
Default ActiveShows whether this block is active at this time and whether it needs to be shown.Checked or UnChecked
Stop PropagationEnd processing here, don't pass control to the next block.Checked or UnChecked
On ErrorsCalled if the system error has occurs in the Block
  • No action
  • Retry
  • Go to step
  • Go to tag
Impact Typeshows the type of the impactPrimary Impacts / Secondary Impacts
LabelTitle of the ImpactTest
DescriptionDescription of the impactImpact description
Amount (Formula)Formula for calculating the impact quantitative representation based on the data from the source VCfield0
UnitUnit of measurement of impact amountsKg
diff --git a/docs/guardian/standard-registry/policies/library-of-policy-examples/mrv-document-operations.md b/docs/guardian/standard-registry/policies/library-of-policy-examples/mrv-document-operations.md index 988302c99f..c3c96c1d3d 100644 --- a/docs/guardian/standard-registry/policies/library-of-policy-examples/mrv-document-operations.md +++ b/docs/guardian/standard-registry/policies/library-of-policy-examples/mrv-document-operations.md @@ -42,7 +42,7 @@ In order to mint tokens into another account (not into the account of the mintin 5. Create the token -![image5.png](<../../../../.gitbook/assets/4 (1) (1) (2).png>) +![image5.png](<../../../../.gitbook/assets/4 (1) (1) (2) (1) (1).png>) ## **Document Operations** @@ -120,7 +120,7 @@ _(Please see_ [_example 2_](data-input-via-forms-using-roles-to-partition-user-a 1.5.3 Add Approve button into the grid -![Adding Approve button to the grid](<../../../../.gitbook/assets/20 (1) (1).png>) +![Adding Approve button to the grid](<../../../../.gitbook/assets/20 (1) (1) (1) (1).png>) 1.5.4 After the Approve, setup the KYC for the account connected to the project diff --git a/docs/guardian/standard-registry/policies/modules-apis/creating-new-module.md b/docs/guardian/standard-registry/policies/modules-apis/creating-new-module.md index b5d947023b..34e5c9b9f0 100644 --- a/docs/guardian/standard-registry/policies/modules-apis/creating-new-module.md +++ b/docs/guardian/standard-registry/policies/modules-apis/creating-new-module.md @@ -9,12 +9,27 @@ Creates a new module. Only users with the Standard Registry role are allowed to Object that contains module configuration {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} -```javascript +{% swagger-response status="201: Created" description="Successful Operation" %} +````scheme +```typescript { - // Response + createDate: string + updateDate: string + _id: string + name: string + description: string + config: Config + creator: string + owner: string + type: string + status: string + uuid: string + codeVersion: string + configFileId: string + id: string } ``` +```` {% endswagger-response %} {% swagger-response status="401: Unauthorized" description="Unauthorized" %} @@ -33,6 +48,14 @@ Object that contains module configuration ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +Invalid module config +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { @@ -44,3 +67,4 @@ Object that contains module configuration ``` {% endswagger-response %} {% endswagger %} + diff --git a/docs/guardian/standard-registry/policies/page-1.md b/docs/guardian/standard-registry/policies/page-1.md index dc538ebcd8..6218e8f6da 100644 --- a/docs/guardian/standard-registry/policies/page-1.md +++ b/docs/guardian/standard-registry/policies/page-1.md @@ -37,7 +37,7 @@ Step 2: In order to make the policy as secondary, we will click on Join button a Step 3: Once, linking is performed successfully, you will get below message: -
+
### 3. **Message Format** diff --git a/docs/guardian/standard-registry/policies/policy-wizard-apis/README.md b/docs/guardian/standard-registry/policies/policy-wizard-apis/README.md new file mode 100644 index 0000000000..0f81dc8262 --- /dev/null +++ b/docs/guardian/standard-registry/policies/policy-wizard-apis/README.md @@ -0,0 +1,2 @@ +# ⚙ Policy Wizard APIs + diff --git a/docs/guardian/standard-registry/policies/policy-wizard-apis/creating-new-policy.md b/docs/guardian/standard-registry/policies/policy-wizard-apis/creating-new-policy.md new file mode 100644 index 0000000000..e7cca609c3 --- /dev/null +++ b/docs/guardian/standard-registry/policies/policy-wizard-apis/creating-new-policy.md @@ -0,0 +1,78 @@ +# Creating new Policy + +{% swagger method="post" path="" baseUrl="/policy" summary="Creates a new policy." %} +{% swagger-description %} +Creates a new policy by wizard. Only users with the Standard Registry role are allowed to make the request. security: +{% endswagger-description %} + +{% swagger-parameter in="body" type="Object" required="true" %} +Object that contains wizard configuration. +{% endswagger-parameter %} + +{% swagger-response status="201: Created" description="Successful Operation" %} +``` +content: + application/json: + schema: + type: object + properties: + policyId: + type: string + wizardConfig: + $ref: "#/components/schemas/WizardConfig" +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} + +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} + +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +``` +content: + application/json: + schema: + $ref: "#/components/schemas/Error" +``` +{% endswagger-response %} +{% endswagger %} + +{% swagger method="post" path="" baseUrl="/policy/push" summary="Creates a new policy." %} +{% swagger-description %} +Creates a new policy by wizard. Only users with the Standard Registry role are allowed to make the request. +{% endswagger-description %} + +{% swagger-parameter in="body" type="Object" required="true" %} +Object that contains wizard configuration. +{% endswagger-parameter %} + +{% swagger-response status="201: Created" description="Successful Operation" %} +``` +content: + application/json: + schema: + $ref: "#/components/schemas/Task" +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} + +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} + +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +``` +content: + application/json: + schema: + $ref: "#/components/schemas/Error" +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/standard-registry/policies/policy-wizard-apis/getting-policy-configuration.md b/docs/guardian/standard-registry/policies/policy-wizard-apis/getting-policy-configuration.md new file mode 100644 index 0000000000..cdf47c5be6 --- /dev/null +++ b/docs/guardian/standard-registry/policies/policy-wizard-apis/getting-policy-configuration.md @@ -0,0 +1,46 @@ +# Getting Policy Configuration + +{% swagger method="post" path="" baseUrl="/{policyId}/config" summary="Get policy config." %} +{% swagger-description %} +Get policy config by wizard. Only users with the Standard Registry role are allowed to make the request. +{% endswagger-description %} + +{% swagger-parameter in="path" name="policyId" type="String" required="true" %} +Policy identifier. +{% endswagger-parameter %} + +{% swagger-parameter in="body" type="Object" required="true" %} +Object that contains wizard configuration. +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} +``` +content: + application/json: + schema: + type: object + properties: + policyConfig: + $ref: "#/components/schemas/PolicyConfig" + wizardConfig: + $ref: "#/components/schemas/WizardConfig" +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} + +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} + +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +``` +content: + application/json: + schema: + $ref: "#/components/schemas/Error" +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/standard-registry/policies/tagging-using-ui.md b/docs/guardian/standard-registry/policies/tagging-using-ui.md index 9f27767726..c903a86a40 100644 --- a/docs/guardian/standard-registry/policies/tagging-using-ui.md +++ b/docs/guardian/standard-registry/policies/tagging-using-ui.md @@ -90,11 +90,3 @@ Tags which have been imported with the Policy or Schema are marked as _**History Any credentialed entity can create/remove a tag on any object at any point of time independently from the Guardian instance where this tagable object (document etc) has been created. This presents a challenge for displaying the up-to-date state of 3rd party tags associated with the object, since continuous search and import/updates of such tags can affect UI responsiveness and general UX. Guardian users can refresh (or ‘pull’) 3rd party tags and update their display in their local Guardian instance by clicking on the corresponding icon (highlighted on the screenshot below). ![synchronization icon](<../../../.gitbook/assets/8 (1) (1).png>) - -1. **Tag Schemas** - -Tags can have attached/linked documents. To add a document to the tag a schema is required. Such documents can be found under the **Tag Schemas** section. - -![image11.png](<../../../.gitbook/assets/10 (1).png>) - -Users can select one of the published schemas in the section when adding a tag to add a corresponding document to the tag being created. diff --git a/docs/guardian/standard-registry/policies/themes-using-ui.md b/docs/guardian/standard-registry/policies/themes-using-ui.md index b7c0db366c..0e6a946c98 100644 --- a/docs/guardian/standard-registry/policies/themes-using-ui.md +++ b/docs/guardian/standard-registry/policies/themes-using-ui.md @@ -10,7 +10,7 @@ Block’s display style is determined by their matching of the criteria defined Policy Configurator contains a section, it can be navigated to by clicking the corresponding button named **Settings** in the top panel. -
+
diff --git a/docs/guardian/standard-registry/retirement-contract/creating-retire-request.md b/docs/guardian/standard-registry/retirement-contract/creating-retire-request.md index a4784321f2..e00385e00b 100644 --- a/docs/guardian/standard-registry/retirement-contract/creating-retire-request.md +++ b/docs/guardian/standard-registry/retirement-contract/creating-retire-request.md @@ -32,4 +32,4 @@ In addition to creation of requests, Users also can see created requests, they c Standard Registry can see all retire requests by each contract. He can also view VC if it is already approved, or approve retire by clicking on “Retire Tokens” button. -
+
diff --git a/docs/guardian/standard-registry/retirement-contract/retirement-apis/creating-new-contract.md b/docs/guardian/standard-registry/retirement-contract/retirement-apis/creating-new-contract.md index 372adba599..60540addd2 100644 --- a/docs/guardian/standard-registry/retirement-contract/retirement-apis/creating-new-contract.md +++ b/docs/guardian/standard-registry/retirement-contract/retirement-apis/creating-new-contract.md @@ -9,7 +9,7 @@ Creates new contract. Only users with the Standard Registry role are allowed to Request Object Parameters. {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { content: diff --git a/docs/guardian/standard-registry/schemas/creating-policy-schema-using-ui.md b/docs/guardian/standard-registry/schemas/creating-policy-schema-using-ui.md deleted file mode 100644 index 9f95410a34..0000000000 --- a/docs/guardian/standard-registry/schemas/creating-policy-schema-using-ui.md +++ /dev/null @@ -1,77 +0,0 @@ -# 💻 Creating Policy Schema using UI - -Policy Schema can also be created by clicking on the New button. - -![](<../../../.gitbook/assets/image (21) (1).png>) - -Once the New button is clicked, we get a dialog box that asks for the following information:\ -1\. Schema Name - -2\. Policy Dropdown: To select any of the imported Policy - -3\. Entity Dropdown: To select any of the Entity: VC / MRV - -4\. Description of Schema. - -5\. Add Field: To add any fields required for the Schema. - -Instead of creating a new Schema from scratch, there is also an option to import it via File or via IPFS. - -To import the Schema, click on the Import button. - -![](<../../../.gitbook/assets/image (7) (2).png>) - -Once the Import button is clicked, we get two options: Import from file and Import from IPFS - -![](<../../../.gitbook/assets/image (29) (2).png>) - -Import from file: You can select the required Schema .schema file from your local machine. Sample iREC Schema (iREC Schema.zip) is provided in the link: [https://github.com/hashgraph/guardian/tree/main/Demo%20Artifacts](https://github.com/hashgraph/guardian/tree/main/Demo%20Artifacts) - -{% hint style="info" %} -Files with **.schema** extension are only accepted. These files are in zip format, i.e. they are zip archives of the text file. -{% endhint %} - -![](<../../../.gitbook/assets/image (17) (1) (1).png>) - -Import from IPFS: You can also import Schema from IPFS by entering the correct Schema timestamp. Sample iREC Schema timestamp is below:\\ - -``` -1644847084.945541771 (iREC 3 Policy) -``` - -![](<../../../.gitbook/assets/image (14) (1) (1).png>) - -Once the Schema is imported, we need to select the Policy from the Policy dropdown to connect the Schema and the Policy. - -![](<../../../.gitbook/assets/image (2) (2) (1).png>) - -![](<../../../.gitbook/assets/image (11) (2) (1).png>) - -After selecting the required Policy, click on the Import button. - -When the Schema is imported, it will be in draft status. - -{% hint style="info" %} -**Note**: Initially when the Schema is created/imported, it will be in draft status. -{% endhint %} - -Once the Schema is imported, we will have the following options:\ -1\. Export the Schema and save it as .zip file in the local machine - -2\. Editing the Schema - -3\. Deleting the Schema - -4\. Displaying JSON document - -To Publish the Schema, click on Publish button. - -![](<../../../.gitbook/assets/image (22) (1).png>) - -After clicking on Publish, you will be prompted to enter the version. After entering the Version and pressing the submit button, the status will change to Published. - -![](<../../../.gitbook/assets/image (18) (1).png>) - -{% hint style="info" %} -**Note**: All Schemas connected to a Policy gets published automatically when Policy gets published. -{% endhint %} diff --git a/docs/guardian/standard-registry/schemas/creating-system-schema-using-ui.md b/docs/guardian/standard-registry/schemas/creating-system-schema-using-ui.md index f5a8cd484c..a3b2f1a097 100644 --- a/docs/guardian/standard-registry/schemas/creating-system-schema-using-ui.md +++ b/docs/guardian/standard-registry/schemas/creating-system-schema-using-ui.md @@ -1,20 +1,77 @@ -# 💻 Creating System Schema using UI +# 💻 Creating Schema using UI -To create a new System Schemas, click on the **New** button at the top right corner. +To create a new Schemas, click on the **New** button at the top right corner. -![](<../../../.gitbook/assets/image (16) (1).png>) +![](<../../../.gitbook/assets/image (16) (1) (1).png>) After clicking on the New button, you will be asked to enter Schema details such as Schema Name, Policy Dropdown, Entity : VC/MRV/NONE, Schema Description and any other required fields. -![](<../../../.gitbook/assets/image (2) (3) (1) (1).png>) +![](<../../../.gitbook/assets/image (1) (1) (1) (2).png>) In addition to the basic Schema details we also have an option to add Field and Condition to each field. -![](<../../../.gitbook/assets/image (3) (3) (1) (1).png>) +![](<../../../.gitbook/assets/image (9) (1) (2).png>) We can also customize the Field keys and Field Title by clicking on Advanced Tab. -![](<../../../.gitbook/assets/image (27) (1).png>) +![](<../../../.gitbook/assets/image (3) (1) (1) (1).png>) + +Instead of creating a new Schema from scratch, there is also an option to import it via File or via IPFS. + +To import the Schema, click on the Import button. + +
+ +{% hint style="info" %} +Files with **.schema** extension are only accepted. These files are in zip format, i.e. they are zip archives of the text file. +{% endhint %} + +Import from IPFS: You can also import Schema from IPFS by entering the correct Schema timestamp. Sample iREC Schema timestamp is below: + +``` +1674821342.619996003 (iREC 3 Policy) +``` + +
+ +Once the Schema is imported, we need to select the Policy from the Policy dropdown to connect the Schema and the Policy. + +
+ +
+ +{% hint style="info" %} +**Note:** + +The major difference between creating / importing System Schema and Policy Schema is that we only get policy selection dropdown when policy schema is imported. +{% endhint %} + +After selecting the required Policy, click on the Import button. + +When the Schema is imported, it will be in draft status. + +{% hint style="info" %} +**Note**: Initially when the Schema is created/imported, it will be in draft status. +{% endhint %} + +Once the Schema is imported, we will have the following options:\ +1\. Export the Schema and save it as .zip file in the local machine + +2\. Editing the Schema + +3\. Deleting the Schema + +4\. Displaying JSON document + +To Publish the Schema, click on Publish button. + +
+ +After clicking on Publish, you will be prompted to enter the version. After entering the Version and pressing the submit button, the status will change to Published. + +{% hint style="info" %} +**Note**: All Schemas connected to a Policy gets published automatically when Policy gets published. +{% endhint %} There are different types of Schema Types: @@ -22,13 +79,7 @@ There are different types of Schema Types: * Verifiable Credential * Encrypted Verifiable Credential -{% hint style="info" %} -**Note: Important points to be noted when "Encrypted Verifiable Credential" type is selected:** - -1. Fields in schema can be marked as private (only when schema has Encrypted Verifiable Credential type) as shown below. -2. Encrypted Verifiable Credential will be published in IPFS with AES GCM encryption. -3. If VP contains Encrypted Verifiable Credential, fields marked as private will be automatically removed. -{% endhint %} +To know more details regarding encrypted Verifiable Credential please look at [Selective Disclosure Demo](../selective-disclosure-demo.md) There are different types of Field Types: @@ -84,7 +135,7 @@ Example of URL which has correct format: [https://ipfs.io/ipfs/bafkreihgbx6fsqup {% hint style="info" %} **Note: Important points to be noted when "String" type is selected:** -1. Pattern input field is added in the advanced mode configuration. +1. Pattern input field is added in the advanced mode configuration. Detailed information for patterns is available on [https://json-schema.org/understanding-json-schema/reference/regular\_expressions.html](https://json-schema.org/understanding-json-schema/reference/regular\_expressions.html). {% endhint %} @@ -93,7 +144,7 @@ Detailed information for patterns is available on [https://json-schema.org/under Once the above details are added, click on the Create button. -![](<../../../.gitbook/assets/image (10) (2) (1).png>) +![](<../../../.gitbook/assets/image (2) (1) (2).png>) Once the System Schema is created, we have options for activating, deleting, editing and viewing JSON documents. diff --git a/docs/guardian/standard-registry/schemas/creating-tag-schemas-using-ui.md b/docs/guardian/standard-registry/schemas/creating-tag-schemas-using-ui.md index bbdd5cd5d8..a83439476a 100644 --- a/docs/guardian/standard-registry/schemas/creating-tag-schemas-using-ui.md +++ b/docs/guardian/standard-registry/schemas/creating-tag-schemas-using-ui.md @@ -4,6 +4,6 @@ Tags can have attached/linked documents. To add a document to the tag a schema is required. Such documents can be found under the **Tag Schemas** section. -
+
Users can select one of the published schemas in the section when adding a tag to add a corresponding document to the tag being created. diff --git a/docs/guardian/standard-registry/schemas/schema-differentiation-using-ui.md b/docs/guardian/standard-registry/schemas/schema-differentiation-using-ui.md index 09de24cffb..6e4ecd8cd0 100644 --- a/docs/guardian/standard-registry/schemas/schema-differentiation-using-ui.md +++ b/docs/guardian/standard-registry/schemas/schema-differentiation-using-ui.md @@ -27,7 +27,7 @@ We click on **Compare** button present in Schemas tab as shown below:
-
+
**Display settings** _–_ description and show/hide settings for each color/type of difference diff --git a/docs/guardian/standard-registry/schemas/system-policy-schemas.md b/docs/guardian/standard-registry/schemas/system-policy-schemas.md index c9f6e9297f..572cd241f8 100644 --- a/docs/guardian/standard-registry/schemas/system-policy-schemas.md +++ b/docs/guardian/standard-registry/schemas/system-policy-schemas.md @@ -9,13 +9,13 @@ There are two types of Schemas: To display System / Policy Schemas in the GUI, we have added a toggle in the Schemas tab. -
+
#### System Schemas Whenever an account is created, System Schemas are generated automatically. -
+
{% hint style="info" %} Note: By default System Schemas cannot be edited/deleted. @@ -27,8 +27,8 @@ This is the second option in the Schemas tab. This option displays all the Polic The below screenshot shows the Policy Schemas of an imported Policy (i.e. iRec). -
+
We also have a filter, where by default, all the Schemas of Policies are shown. We can also select a particular Policy to show the Schemas of the selected Policy. -
+
diff --git a/docs/guardian/standard-registry/selective-disclosure-demo.md b/docs/guardian/standard-registry/selective-disclosure-demo.md new file mode 100644 index 0000000000..c73f62782d --- /dev/null +++ b/docs/guardian/standard-registry/selective-disclosure-demo.md @@ -0,0 +1,18 @@ +# 🔐 Selective Disclosure Demo + +Please check the steps involved in performing Selective Disclosure functionality: + +1. We need to select “Encrypted Verifiable Credential” option as an entity type while creating Schema. + +![](<../../.gitbook/assets/0 (5).png>) + +2. Some of the fields in schema can be marked as private (only when schema has Encrypted Verifiable Credential type): + +![](<../../.gitbook/assets/1 (1).png>) + +3. Encrypted Verifiable Credential will be published in IPFS with AES GCM encryption + +Aes256Gcm.nIwedhii-6Wd5li2F6G7jVDTh1vBUrtOvWGBCMQ4NYHnZoY5\_FeAorxZKw7of4zFTw\_2XnRlzP88EPDIASw540waI5\_GsdfX87YYeDIlYV09eTGeg6nTT6VjKoKFDSKDFVgXXqmzXCX9Y9i\_vQbWRiUDeFNLhJrH6m452HBCWNFFeKjTeqJSM8fvPWum\_1rpdcZtQUjs0sdZTGFafx-6q\_woO4Fy0TMzq4I7ETUkN6qrdXn90grlwoAHiUNuIcnofqwfwNldnJRHX8aWJRTseudZYZzF\_XvX3078qC-JZy0Oh7iTvE-Ok\_OCPnhBYkWJduCr-9qp0ewYfESB40j9YnQ5Y44OmNQU36Isdagdg9RQ5RFDNZIBBlbY8kXeU474vb6riqjGWW-veXM6JsacOXxLgvdYN1JLrq947ruUvGg4Cq5OKnXQ9Db19mVzl46sa-26UgtIJgSuK1oWKEToV6QO\_aX-Qjg5naNv2M2oeg3Yn8ZEnHvlmeWowSmPKFGes5-X6dQyWnAKH5-Scc\_HWFqhY1KGzh\_\_VTpGbiwTlg1gjq4Zuzlk6ce0OcuTgVeSYuifUOu6T4C9qCKh5SfsTzHegRJ0-Q29bmCsHIKOUE9oeacIRozr5z-WG87o2ohveIV2Oz-ZJgU\_EplKNc9wu1WEQ88oWeiCPmssWI0pDy388\_4zy\_CMgzc9cxJ6frAoKPLzKr\_3aL-ORrOaSEAARv13W37XehmqyP230N4e\_h1hzS7lcgotb3d2ElLt3My1WuOLySylH1AV1BqYpZBniOui0KT-rxXfHDhIkwYwYx-4vrlfVtqOcC6QX84G9uL0DnshUXxBA\_\_0KciO4v8u6qSAhhX6ubnXGQNFZ9nsV1QhMg2EitufxcxRFeztjbTtL8aOKKGltOIXDY88-oc\_k4luVW3ByVgmaaapd7jnFarHLlV2O41GR8CtX-2\_i3LT\_5xU\_WAtZIolRZZNujr-rRoPy2sQSDQHgBI65KNufTyCWlpyVhD-c-UMN0GV3Qf1K0yAcqRJF3nSuhyxlxR\_mQ3D3TrtHgiWdGir-5BDEJ8rVpW77Okb6KqXU1X\_nyISm4moG5vvj4-uoiZ5LeKOrUE3sxFzmvvorXkiKr-\_AFgK7uI8wxThgeN5XJPnYsltqAqI2tqsLpP6kuBfaktQQi6ItJoFoms\_IK2bohewR8XKu4GgmFxBla76rZ1HkWbovj3JA-n4bW9C9A1G5nOshCuBHUn4TFHOCkzrRGVM7hwAW9Rh-4ZfovYiENu0gv6Dqm27Flnm6LTQ2IN2BQcH37WmFNNycVE5Qr2hKzIM6CSaeV3ukvg=.QUAAAAAFaXYADAAAAADFkFYv-x1EYD2iwcsFYXQAEAAAAACQLRr6flPBpSYZk-zlo82VAmFkAAUAAABub25lAAA=.Pbkdf2Hmac.S0EAAAAFaXYAFAAAAAC5tzmfz7TiZiEsE5cs5NOgv\_-H7BBpAOxRAAAQbAAgAAAAAmhhc2gABwAAAFNIQTI1NgAA + +4. If VP contains Encrypted Verifiable Credential, fields marked as private will be automatically removed + diff --git a/docs/guardian/standard-registry/trustchain-apis/building-and-returning-1.md b/docs/guardian/standard-registry/trustchain-apis/building-and-returning-1.md new file mode 100644 index 0000000000..3aacd5ab11 --- /dev/null +++ b/docs/guardian/standard-registry/trustchain-apis/building-and-returning-1.md @@ -0,0 +1,51 @@ +# (deprecated) Building and returning + +### BUILDING AND RETURNING A TRUST CHAIN + +{% swagger method="get" path="" baseUrl="/trustchains/{hash}" summary="Returns a trustchain for a VP document" %} +{% swagger-description %} +Builds and returns a trustchain, from the VP to the root VC document. Only users with the Auditor role are allowed to make the request. +{% endswagger-description %} + +{% swagger-parameter in="path" name="hash" type="String" required="true" %} +Hash or ID of a VP document +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/TrustChains' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/standard-registry/trustchain-apis/requesting-1.md b/docs/guardian/standard-registry/trustchain-apis/requesting-1.md new file mode 100644 index 0000000000..9e2de71314 --- /dev/null +++ b/docs/guardian/standard-registry/trustchain-apis/requesting-1.md @@ -0,0 +1,49 @@ +# (deprecated) Requesting + +### REQUESTS ALL VP DOCUMENTS + +{% swagger method="get" path="" baseUrl="/trustchains" summary="Returns a list of all VP documents" %} +{% swagger-description %} +Requests all VP documents. Only users with the Auditor role are allowed to make the request +{% endswagger-description %} + +{% swagger-response status="200: OK" description="" %} +```javascript +{ + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/VerifiablePresentation' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/tokens/creating-token-using-ui.md b/docs/guardian/tokens/creating-token-using-ui.md index af8cb349e9..459b3d3ecc 100644 --- a/docs/guardian/tokens/creating-token-using-ui.md +++ b/docs/guardian/tokens/creating-token-using-ui.md @@ -12,15 +12,5 @@ Step 2: Once button is clicked, we get a pop up box to enter token details such Following are the parameters required to complete the token creation process: -| Field Name | Description | Exmaple | -| ------------- | ----------------------------------------------------------------------- | -------------------- | -| Token Name | Name of the token | iREC Token | -| Token Symbol | Symbol of the token | I | -| Token Type | whether the token to be fungible and non fungible | F/N | -| Decimals | Decimals to be allowed to the token | 2 | -| Enable Admin | Enabled to make changes in the token settings even after creating token | Checked or Unchecked | -| Change Supply | Enabled to change the token supply | Checked or Unchecked | -| Enable Freeze | Enabling Freezing of the token | Checked or Unchecked | -| Enable KYC | Enabling KYC when token is created | Checked or Unchecked | -| Enable Wipe | Enabled to wipe the token supply | Checked or Unchecked | +
Field NameDescriptionExmaple
Token NameName of the tokeniREC Token
Token SymbolSymbol of the tokenI
Token Typewhether the token to be fungible and non fungibleF/N
DecimalsDecimals to be allowed to the token2
Enable AdminEnabled to make changes in the token settings even after creating tokenChecked or Unchecked
Change SupplyEnabled to change the token supplyChecked or Unchecked
Enable FreezeEnabling Freezing of the tokenChecked or Unchecked
Enable KYCEnabling KYC when token is createdChecked or Unchecked
Enable WipeEnabled to wipe the token supplyChecked or Unchecked
diff --git a/docs/guardian/tokens/token-operations/token-apis/grants-kyc-for-the-user-1.md b/docs/guardian/tokens/token-operations/token-apis/grants-kyc-for-the-user-1.md new file mode 100644 index 0000000000..756bf4873c --- /dev/null +++ b/docs/guardian/tokens/token-operations/token-apis/grants-kyc-for-the-user-1.md @@ -0,0 +1,67 @@ +# (deprecated) Grants KYC for the user + +### GRANTS KYC FLAG FOR THE USER + +{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/grantKyc" summary="Sets the KYC flag for the user." %} +{% swagger-description %} +Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. +{% endswagger-description %} + +{% swagger-parameter in="path" name="tokenID" type="String" required="true" %} +Token ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="username" type="String" required="true" %} +Username +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/TokenInfo' +} +``` +{% endswagger-response %} + +{% swagger-response status="400: Bad Request" description="Bad Request" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} + diff --git a/docs/guardian/tokens/token-operations/token-apis/revoke-kyc-of-the-user-1.md b/docs/guardian/tokens/token-operations/token-apis/revoke-kyc-of-the-user-1.md new file mode 100644 index 0000000000..a7d5ecf183 --- /dev/null +++ b/docs/guardian/tokens/token-operations/token-apis/revoke-kyc-of-the-user-1.md @@ -0,0 +1,66 @@ +# (deprecated) Revoke KYC of the user + +### UNSETS KYC FLAG FOR THE USER + +{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/revokeKyc" summary="Unsets the KYC flag for the user." %} +{% swagger-description %} +Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. +{% endswagger-description %} + +{% swagger-parameter in="path" name="tokenID" type="String" required="true" %} +Token ID +{% endswagger-parameter %} + +{% swagger-parameter in="path" name="username" type="String" required="true" %} +Username +{% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Successful Operation" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/TokenInfo' +} +``` +{% endswagger-response %} + +{% swagger-response status="400: Bad Request" description="Bad Request" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} + +{% swagger-response status="401: Unauthorized" description="Unauthorized" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} +```javascript +{ + // Response +} +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="" %} +```javascript +{ + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +} +``` +{% endswagger-response %} +{% endswagger %} diff --git a/docs/guardian/users/mobile-support-for-data-interface/mobile-operation-for-the-user.md b/docs/guardian/users/mobile-support-for-data-interface/mobile-operation-for-the-user.md index b1524854bd..de9760f433 100644 --- a/docs/guardian/users/mobile-support-for-data-interface/mobile-operation-for-the-user.md +++ b/docs/guardian/users/mobile-support-for-data-interface/mobile-operation-for-the-user.md @@ -7,7 +7,7 @@ The first adaptation relates to the redesign of the creation of new accounts. Th Here the images below show the selection of account type and selection of username and password in order to create a new account. \ -![](<../../../.gitbook/assets/1 (1).png>)![](../../../.gitbook/assets/2.png) +![](<../../../.gitbook/assets/1 (1) (4).png>)![](../../../.gitbook/assets/2.png) @@ -22,7 +22,7 @@ The various menus and submenus (in case there are any) have been moved upon clic Also some information about the user is also presented, such as the name of the user (in this case "user1234") and his respective Hedera ID and HBar balance. -![](<../../../.gitbook/assets/4 (1) (1).png>)\ +![](<../../../.gitbook/assets/4 (1) (1) (2).png>)\ ### **User first registration into Guardian** @@ -42,7 +42,7 @@ The user registration form into a policy has also been redesigned. This makes th The images below are the registration forms which have been redesigned -![](../../../.gitbook/assets/8.png)![](<../../../.gitbook/assets/9 (2).png>) +![](../../../.gitbook/assets/8.png)![](<../../../.gitbook/assets/9 (1) (3) (1).png>) diff --git a/docs/monitoring-tools.md b/docs/monitoring-tools.md new file mode 100644 index 0000000000..bdf0b3895e --- /dev/null +++ b/docs/monitoring-tools.md @@ -0,0 +1,36 @@ +--- +description: >- + The Guardian application is now integrated into some monitoring tools to give + you metrics to observe and analyze the performance and health of applications +--- + +# 📉 Monitoring tools + +Now, the Guardian application provides some ways to monitor its services using two widely used open-source applications. + +[Prometheus](https://prometheus.io/) and [Grafana](https://grafana.com/) are powerful monitoring tools commonly used to observe and analyze the performance and health of applications. In the context of monitoring the Guardian application, Prometheus and Grafana provide a comprehensive solution to collect, store, visualize, and alert on various metrics and data points. + +Prometheus is an open-source monitoring system that excels at collecting and storing time-series data. It is designed to monitor highly dynamic and distributed environments, making it an ideal choice for modern application architectures. Prometheus employs a pull-based model, where it periodically scrapes metrics data from configured targets, such as application instances or infrastructure components. + +With Prometheus, you can instrument your Guardian application to expose various metrics, such as request latency, error rates, resource utilization, and custom application-specific metrics. Prometheus stores this data in a time-series database, allowing you to query historical metrics and generate meaningful insights. Additionally, Prometheus offers a flexible querying language called PromQL, which enables advanced data analysis and aggregation. + +Grafana is a popular open-source data visualization and analytics platform that complements Prometheus by providing a feature-rich dashboarding solution. It allows you to create visually appealing and customizable dashboards to monitor and analyze metrics collected by Prometheus. Grafana supports a wide range of visualization options, including graphs, tables, heatmaps, and alerts. + +We have integrated Prometheus with Grafana, allowing you to create real-time dashboards that display critical metrics and provide a holistic view of your Guardian application's performance. These dashboards can help you identify bottlenecks, track trends, and troubleshoot issues promptly. Grafana also allows you to set up alerts based on predefined thresholds or complex rules, ensuring that you receive notifications when important metrics cross certain boundaries. + +Together, Prometheus and Grafana form a robust monitoring stack for the Guardian application, enabling you to gain valuable insights into its behavior and performance. By leveraging the power of Prometheus for data collection and Grafana for data visualization, you can proactively monitor your application, make data-driven decisions, and ensure a seamless user experience. + +These services are being scraped by Prometheus, which was defined to running here [**http://localhost:9090**](http://localhost:9090/). At this point, you can create your queries. + +* api-gateway +* guardian-service +* auth-service +* policy-service +* topic-viewer +* mrv-sender + +A complete dashboard was created by default using the Grafana application to present interesting metrics. This dashboard can be accessed here once you have the Guardian application running -> [**http://localhost:9080**](http://localhost:9080/). + +
+ +\ diff --git a/docs/multi-user-roles/roles-and-groups.md b/docs/multi-user-roles/roles-and-groups.md index 6d73d3e5c2..10ace7db1e 100644 --- a/docs/multi-user-roles/roles-and-groups.md +++ b/docs/multi-user-roles/roles-and-groups.md @@ -10,7 +10,7 @@ Roles can be created by adding Role Property and its Value in Policy Configurato
-
+
#### 1.2 Usage @@ -67,4 +67,4 @@ Groups are separate sets of documents access , which can be limited to users who When a policy contains multiple groups, users have an option to switch between those they are included in. The selection menu also allows to switch to the ‘no group’ default state, i.e. the state in which the user is not acting as a member of any group. -
+
diff --git a/docs/policy-creation-using-the-guardian-apis/creation-of-a-policy.md b/docs/policy-creation-using-the-guardian-apis/creation-of-a-policy.md index 7cc23116d0..085d571a03 100644 --- a/docs/policy-creation-using-the-guardian-apis/creation-of-a-policy.md +++ b/docs/policy-creation-using-the-guardian-apis/creation-of-a-policy.md @@ -11,7 +11,7 @@ Creates a new policy. Only users with the Standard Registry role are allowed to Object that contains policy configuration. {% endswagger-parameter %} -{% swagger-response status="201: Created" description="Successful operation" %} +{% swagger-response status="201: Created" description="Created" %} {% endswagger-response %} diff --git a/docs/policy-creation-using-the-guardian-apis/import-from-zip-file.md b/docs/policy-creation-using-the-guardian-apis/import-from-zip-file.md index 1297503a9e..5b24b8e8ca 100644 --- a/docs/policy-creation-using-the-guardian-apis/import-from-zip-file.md +++ b/docs/policy-creation-using-the-guardian-apis/import-from-zip-file.md @@ -11,7 +11,7 @@ Imports new policy and all associated artifacts, such as schemas and VCs, from t A zip file that contains the policy and associated schemas and VCs to be imported {% endswagger-parameter %} -{% swagger-response status="201: Created" description="Successful Operation" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { content: diff --git a/docs/policy-creation-using-the-guardian-apis/prerequesite-steps.md b/docs/policy-creation-using-the-guardian-apis/prerequesite-steps.md index f7052e9e91..ccbabaf765 100644 --- a/docs/policy-creation-using-the-guardian-apis/prerequesite-steps.md +++ b/docs/policy-creation-using-the-guardian-apis/prerequesite-steps.md @@ -20,6 +20,19 @@ test {% swagger-parameter in="body" name="role" type="String" required="true" %} STANDARD_REGISTRY {% endswagger-parameter %} + +{% swagger-response status="201: Created" description="Created" %} + + +```typescript +{ + username: string + password: string + password_confirmation: string + role: string +} +``` +{% endswagger-response %} {% endswagger %} ### **Login** @@ -38,22 +51,22 @@ test {% endswagger-parameter %} {% swagger-response status="200: OK" description="Successful Operation" %} -```javascript +````javascript +```typescript { - { - "username":"njkgur8x", - "did":null, - "role":"STANDARD_REGISTRY", - "accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5qa2d1cjh4IiwiZGlkIjpudWxsLCJyb2xlIjoiUk9PVF9BVVRIT1JJVFkiLCJpYXQiOjE2NDMwMTkxMDh9.Z4l77uhaPu09gkjSZpqcF2H0S27oGvFfOA-bytzrsL4" -} + username: string + did: any + role: string + accessToken: string } ``` +```` {% endswagger-response %} {% endswagger %} ### **Hedera account creation** -{% swagger method="get" path="" baseUrl="/api/v1/demo/randomKey" summary="" %} +{% swagger method="get" path="" baseUrl="/api/v1/demo/random-key" summary="" %} {% swagger-description %} {% endswagger-description %} @@ -188,6 +201,34 @@ VC {% swagger-parameter in="body" name="version" required="true" %} {"version":"1.0.0"} {% endswagger-parameter %} + +{% swagger-response status="200: OK" description="Ok" %} + +{% endswagger-response %} + +{% swagger-response status="403: Forbidden" description="Forbidden" %} + +{% endswagger-response %} + +{% swagger-response status="404: Not Found" description="Not Found" %} + +{% endswagger-response %} + +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +Version already exists. +``` + +``` +Schema is published. +``` +{% endswagger-response %} + +{% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} + +{% endswagger-response %} {% endswagger %} ### **Token creation** @@ -237,7 +278,7 @@ true true {% endswagger-parameter %} -{% swagger-response status="200: OK" description="" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { @@ -248,4 +289,12 @@ true } ``` {% endswagger-response %} + +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +User not registered +``` +{% endswagger-response %} {% endswagger %} diff --git a/docs/policy-flow/policy-demo.md b/docs/policy-flow/policy-demo.md index 9aee91a4a3..3ca757e095 100644 --- a/docs/policy-flow/policy-demo.md +++ b/docs/policy-flow/policy-demo.md @@ -2,7 +2,7 @@ Once you login as a Standard Registry and finish the setup, click on Policies tab. -![](<../.gitbook/assets/image (4) (1) (2) (1).png>) +![](<../.gitbook/assets/image (4) (1) (1).png>) We have two options to create Policy : @@ -21,7 +21,7 @@ We have two options to create Policy : 1.3 Once the details are filled and clicked on OK. Initially, Policy is created in Draft status. -![](<../.gitbook/assets/image (1) (1) (2).png>) +![](<../.gitbook/assets/image (1) (1) (1) (1).png>) 1.4 You can even edit the Policy by clicking Edit button. @@ -33,7 +33,7 @@ We have two options to create Policy : 1.6 Once the Policy is configured, you can go to Policies tab and click on Publish. -![](<../.gitbook/assets/image (6) (1) (1).png>) +![](<../.gitbook/assets/image (6) (1) (1) (1).png>) ### 2. Importing Policy either from File or from IPFS @@ -43,11 +43,11 @@ Instead of creating Policy from scratch, there is an option of importing the Pol **Note:** Files with **.policy** extension are only accepted. These files are in zip format, i.e. they are zip archives of the text file. {% endhint %} -![](<../.gitbook/assets/image (11) (1) (2).png>) +![](<../.gitbook/assets/image (11) (1) (1) (1) (1).png>) 2.1 Once the .zip file is selected, we get the Policy Import Review screen. Once everything looks good, click on Import Button. -![](<../.gitbook/assets/image (8) (1) (2).png>) +![](<../.gitbook/assets/image (8) (1) (1).png>) 2.2 The Policy can also be imported by importing it from IPFS. @@ -71,6 +71,6 @@ Instead of creating Policy from scratch, there is an option of importing the Pol 2.6 There is also an option to Export the Policy. To export the policy click on Export button. Once, you click on Export, you get Export dialog, where we have two exporting options: Copy message Identifier and saving the Policy as file. -![](<../.gitbook/assets/image (10) (1) (2).png>) +![](<../.gitbook/assets/image (10) (3) (1) (1).png>) When you click on Save to file, Policy is exported as a .zip file. diff --git a/docs/schema-creation-using-the-guardian-apis/creation-of-a-schema-1.md b/docs/schema-creation-using-the-guardian-apis/creation-of-a-schema-1.md index 62e22bb225..df9e3d605f 100644 --- a/docs/schema-creation-using-the-guardian-apis/creation-of-a-schema-1.md +++ b/docs/schema-creation-using-the-guardian-apis/creation-of-a-schema-1.md @@ -15,7 +15,7 @@ The number of pages to skip before starting to collect the result set The numbers of items to return {% endswagger-parameter %} -{% swagger-response status="201: Created" description="Successful Operation" %} +{% swagger-response status="200: OK" description="Successful Operation" %} ```javascript { headers: diff --git a/docs/schema-creation-using-the-guardian-apis/creation-of-schema-related-to-the-topic.md b/docs/schema-creation-using-the-guardian-apis/creation-of-schema-related-to-the-topic.md index 174e0cf7e0..1a5671bfb3 100644 --- a/docs/schema-creation-using-the-guardian-apis/creation-of-schema-related-to-the-topic.md +++ b/docs/schema-creation-using-the-guardian-apis/creation-of-schema-related-to-the-topic.md @@ -37,6 +37,10 @@ Object that contains a valid schema ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/deleting-a-schema.md b/docs/schema-creation-using-the-guardian-apis/deleting-a-schema.md index edee09a770..aa58f4e44b 100644 --- a/docs/schema-creation-using-the-guardian-apis/deleting-a-schema.md +++ b/docs/schema-creation-using-the-guardian-apis/deleting-a-schema.md @@ -40,6 +40,14 @@ Schema ID ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="" %} + + +``` +Schema is published. +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/export-a-schema-1.md b/docs/schema-creation-using-the-guardian-apis/export-a-schema-1.md index 1212eecfa1..f988c438fc 100644 --- a/docs/schema-creation-using-the-guardian-apis/export-a-schema-1.md +++ b/docs/schema-creation-using-the-guardian-apis/export-a-schema-1.md @@ -1,6 +1,6 @@ # Export Files from Schema -### EXPORTING SCHEMA FILES FOR THE SCHEMA +### [NextCreation of Schema related to the topic](https://app.gitbook.com/o/-LuC734MpqlgwA6zyhAO/s/bOsLGPRQ1YXxw4wDcVrE/\~/changes/334/guardian/standard-registry/schemas/schema-creation-using-apis/creation-of-schema-related-to-the-topic)EXPORTING SCHEMA FILES FOR THE SCHEMA {% swagger method="post" path="" baseUrl="/schemas/{schemaId}/export/file" summary="Return zip file with schemas" %} {% swagger-description %} @@ -35,6 +35,10 @@ Selected schema ID ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/importing-schema-from-ipfs.md b/docs/schema-creation-using-the-guardian-apis/importing-schema-from-ipfs.md index e9aa27a911..67215d8548 100644 --- a/docs/schema-creation-using-the-guardian-apis/importing-schema-from-ipfs.md +++ b/docs/schema-creation-using-the-guardian-apis/importing-schema-from-ipfs.md @@ -42,6 +42,10 @@ Object that contains the identifier of the Hedera message which contains the IPF ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/importing-zip-file-containing-schema.md b/docs/schema-creation-using-the-guardian-apis/importing-zip-file-containing-schema.md index de14fa3e69..00bfed3d51 100644 --- a/docs/schema-creation-using-the-guardian-apis/importing-zip-file-containing-schema.md +++ b/docs/schema-creation-using-the-guardian-apis/importing-zip-file-containing-schema.md @@ -42,6 +42,10 @@ A zip file containing schema to be imported ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/publishing-schema-based-on-schema-id.md b/docs/schema-creation-using-the-guardian-apis/publishing-schema-based-on-schema-id.md index 0a49355313..a20fce450c 100644 --- a/docs/schema-creation-using-the-guardian-apis/publishing-schema-based-on-schema-id.md +++ b/docs/schema-creation-using-the-guardian-apis/publishing-schema-based-on-schema-id.md @@ -44,6 +44,10 @@ Object that contains policy version ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-creation-using-the-guardian-apis/updating-schema.md b/docs/schema-creation-using-the-guardian-apis/updating-schema.md index b6e7ebe357..41c9041de0 100644 --- a/docs/schema-creation-using-the-guardian-apis/updating-schema.md +++ b/docs/schema-creation-using-the-guardian-apis/updating-schema.md @@ -44,6 +44,10 @@ Object that contains a valid schema including the id of the schema that is to be ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/schema-related-apis-for-asynchronous-execution/creation-of-schema.md b/docs/schema-related-apis-for-asynchronous-execution/creation-of-schema.md index 2b1b226ba5..c620865309 100644 --- a/docs/schema-related-apis-for-asynchronous-execution/creation-of-schema.md +++ b/docs/schema-related-apis-for-asynchronous-execution/creation-of-schema.md @@ -13,7 +13,7 @@ Topic ID Object that contains a valid schema. {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: diff --git a/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-.zip.md b/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-.zip.md index cbb00a2ef7..4b34f939c8 100644 --- a/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-.zip.md +++ b/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-.zip.md @@ -13,7 +13,7 @@ A zip file containing schema to be imported topic ID {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: diff --git a/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-ipfs.md b/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-ipfs.md index 317d2c477d..6cc4521857 100644 --- a/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-ipfs.md +++ b/docs/schema-related-apis-for-asynchronous-execution/importing-schema-from-ipfs.md @@ -13,7 +13,7 @@ Object that contains the identifier of the Hedera message which contains the IPF Topic ID {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: diff --git a/docs/schema-related-apis-for-asynchronous-execution/previews-the-schema-from-ipfs.md b/docs/schema-related-apis-for-asynchronous-execution/previews-the-schema-from-ipfs.md index 965b296f35..0046ff2615 100644 --- a/docs/schema-related-apis-for-asynchronous-execution/previews-the-schema-from-ipfs.md +++ b/docs/schema-related-apis-for-asynchronous-execution/previews-the-schema-from-ipfs.md @@ -9,7 +9,7 @@ Previews the schema from IPFS without loading it into the local DB. Only users w Object that contains the identifier of the Hedera message which contains the IPFS CID of the schema. {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: diff --git a/docs/schema-related-apis-for-asynchronous-execution/publishing-schema.md b/docs/schema-related-apis-for-asynchronous-execution/publishing-schema.md index 4ae22a958a..f91b6ad596 100644 --- a/docs/schema-related-apis-for-asynchronous-execution/publishing-schema.md +++ b/docs/schema-related-apis-for-asynchronous-execution/publishing-schema.md @@ -13,7 +13,7 @@ Schema ID Object that contains policy version. {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: diff --git a/docs/settings-apis/adding-settings.md b/docs/settings-apis/adding-settings.md index 7a058e2ce2..b785af47cd 100644 --- a/docs/settings-apis/adding-settings.md +++ b/docs/settings-apis/adding-settings.md @@ -19,7 +19,7 @@ Key of the operator API key of NFT {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { // Response diff --git a/docs/system-schemas-apis/creates-new-system-schema.md b/docs/system-schemas-apis/creates-new-system-schema.md index b031849e51..ad9ac18444 100644 --- a/docs/system-schemas-apis/creates-new-system-schema.md +++ b/docs/system-schemas-apis/creates-new-system-schema.md @@ -39,6 +39,10 @@ Object that contains valid Schema ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/system-schemas-apis/delete-system-schema.md b/docs/system-schemas-apis/delete-system-schema.md index bf2f8c38bc..5116135f2f 100644 --- a/docs/system-schemas-apis/delete-system-schema.md +++ b/docs/system-schemas-apis/delete-system-schema.md @@ -11,7 +11,7 @@ Deletes the system schema with the provided Schema ID. Only users with the Stand SchemaID {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="204: No Content" description="No Content" %} ```javascript { content: diff --git a/docs/system-schemas-apis/publishes-the-schema.md b/docs/system-schemas-apis/publishes-the-schema.md index 1bed323817..184e46c12a 100644 --- a/docs/system-schemas-apis/publishes-the-schema.md +++ b/docs/system-schemas-apis/publishes-the-schema.md @@ -38,9 +38,23 @@ Object that contains Policy Version {% swagger-response status="403: Forbidden" description="Forbidden" %} ```javascript -{ - // Response -} +Schema is not system. +``` +{% endswagger-response %} + +{% swagger-response status="404: Not Found" description="Not Found" %} + + +``` +Schema not found. +``` +{% endswagger-response %} + +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +Schema is active. ``` {% endswagger-response %} diff --git a/docs/system-schemas-apis/schema-type.md b/docs/system-schemas-apis/schema-type.md index 6738aba5c2..8f36d4a739 100644 --- a/docs/system-schemas-apis/schema-type.md +++ b/docs/system-schemas-apis/schema-type.md @@ -38,6 +38,14 @@ Schema Type ``` {% endswagger-response %} +{% swagger-response status="404: Not Found" description="Not Found" %} + + +``` +Schema not found. +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/system-schemas-apis/updates-the-schema.md b/docs/system-schemas-apis/updates-the-schema.md index 642e908d31..51ddb31a57 100644 --- a/docs/system-schemas-apis/updates-the-schema.md +++ b/docs/system-schemas-apis/updates-the-schema.md @@ -44,6 +44,14 @@ Object that contains valid Schema ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +Schema is active. +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/token-apis/grants-kyc-for-the-user.md b/docs/token-apis/grants-kyc-for-the-user.md index 955b8bf50e..4093b0b6a5 100644 --- a/docs/token-apis/grants-kyc-for-the-user.md +++ b/docs/token-apis/grants-kyc-for-the-user.md @@ -2,7 +2,7 @@ ### GRANTS KYC FLAG FOR THE USER -{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/grantKyc" summary="Sets the KYC flag for the user." %} +{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/grant-kyc" summary="Sets the KYC flag for the user." %} {% swagger-description %} Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. {% endswagger-description %} diff --git a/docs/token-apis/revoke-kyc-of-the-user.md b/docs/token-apis/revoke-kyc-of-the-user.md index 4cb4f71eb4..d4b1d10685 100644 --- a/docs/token-apis/revoke-kyc-of-the-user.md +++ b/docs/token-apis/revoke-kyc-of-the-user.md @@ -2,7 +2,7 @@ ### UNSETS KYC FLAG FOR THE USER -{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/revokeKyc" summary="Unsets the KYC flag for the user." %} +{% swagger method="put" path="" baseUrl="/tokens/{tokenId}/{username}/revoke-kyc" summary="Unsets the KYC flag for the user." %} {% swagger-description %} Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. {% endswagger-description %} diff --git a/docs/token-apis/token-listing-1.md b/docs/token-apis/token-listing-1.md index 4bad25a260..e81fb61461 100644 --- a/docs/token-apis/token-listing-1.md +++ b/docs/token-apis/token-listing-1.md @@ -11,7 +11,7 @@ Creates a new token. Only users with the Standard Registry role are allowed to m Object that contains token information {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="201: Created" description="Created" %} ```javascript { content: @@ -51,6 +51,14 @@ Object that contains token information ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +User not registered +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/token-related-apis-for-asynchronous-execution/associating-user-with-the-hedera-token.md b/docs/token-related-apis-for-asynchronous-execution/associating-user-with-the-hedera-token.md index ae1b959b03..dc8b8113f7 100644 --- a/docs/token-related-apis-for-asynchronous-execution/associating-user-with-the-hedera-token.md +++ b/docs/token-related-apis-for-asynchronous-execution/associating-user-with-the-hedera-token.md @@ -9,7 +9,7 @@ Associates the user with the provided Hedera token. Only users with the Standard Token ID {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: @@ -36,6 +36,14 @@ Token ID ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +User not registered +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/token-related-apis-for-asynchronous-execution/disassociating-user-with-the-hedera-token.md b/docs/token-related-apis-for-asynchronous-execution/disassociating-user-with-the-hedera-token.md index 60efbeac90..cd44537728 100644 --- a/docs/token-related-apis-for-asynchronous-execution/disassociating-user-with-the-hedera-token.md +++ b/docs/token-related-apis-for-asynchronous-execution/disassociating-user-with-the-hedera-token.md @@ -9,7 +9,7 @@ Disassociates the user with the provided Hedera token. Only users with the Stand Token ID {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: @@ -36,6 +36,14 @@ Token ID ``` {% endswagger-response %} +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +User not registered +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { @@ -47,3 +55,4 @@ Token ID ``` {% endswagger-response %} {% endswagger %} + diff --git a/docs/token-related-apis-for-asynchronous-execution/setting-kyc-for-the-user.md b/docs/token-related-apis-for-asynchronous-execution/setting-kyc-for-the-user.md index 28d96131b6..62cefc3bf5 100644 --- a/docs/token-related-apis-for-asynchronous-execution/setting-kyc-for-the-user.md +++ b/docs/token-related-apis-for-asynchronous-execution/setting-kyc-for-the-user.md @@ -1,6 +1,6 @@ # Setting KYC for the User -{% swagger method="put" path="" baseUrl="/tokens/push/{tokenId}/{username}/grantKyc" summary="Sets the KYC flag for the user." %} +{% swagger method="put" path="" baseUrl="/tokens/push/{tokenId}/{username}/grant-kyc" summary="Sets the KYC flag for the user." %} {% swagger-description %} Sets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. {% endswagger-description %} diff --git a/docs/token-related-apis-for-asynchronous-execution/token-creation.md b/docs/token-related-apis-for-asynchronous-execution/token-creation.md index 43b1997c37..4dd452c12e 100644 --- a/docs/token-related-apis-for-asynchronous-execution/token-creation.md +++ b/docs/token-related-apis-for-asynchronous-execution/token-creation.md @@ -9,7 +9,7 @@ Creates a new token. Only users with the Standard Registry role are allowed to m Object that contains token information {% endswagger-parameter %} -{% swagger-response status="200: OK" description="Successful Operation" %} +{% swagger-response status="202: Accepted" description="Accepted" %} ```javascript { content: @@ -36,6 +36,30 @@ Object that contains token information ``` {% endswagger-response %} +{% swagger-response status="403: Forbidden" description="" %} + +{% endswagger-response %} + +{% swagger-response status="404: Not Found" description="Not Found" %} + + +``` +Token not found +``` +{% endswagger-response %} + +{% swagger-response status="422: Unprocessable Entity" description="Unprocessable Entity" %} + + +``` +The field tokenId is required +``` + +``` +User not registered +``` +{% endswagger-response %} + {% swagger-response status="500: Internal Server Error" description="Internal Server Error" %} ```javascript { diff --git a/docs/token-related-apis-for-asynchronous-execution/unsetting-kyc-for-the-user.md b/docs/token-related-apis-for-asynchronous-execution/unsetting-kyc-for-the-user.md index b70d39e867..389d9ce275 100644 --- a/docs/token-related-apis-for-asynchronous-execution/unsetting-kyc-for-the-user.md +++ b/docs/token-related-apis-for-asynchronous-execution/unsetting-kyc-for-the-user.md @@ -1,6 +1,6 @@ # Unsetting KYC for the User -{% swagger method="put" path="" baseUrl="/tokens/push/{tokenId}/{username}/revokeKyc" summary="Unsets the KYC flag for the user." %} +{% swagger method="put" path="" baseUrl="/tokens/push/{tokenId}/{username}/revoke-kyc" summary="Unsets the KYC flag for the user." %} {% swagger-description %} Unsets the KYC flag for the user. Only users with the Standard Registry role are allowed to make the request. {% endswagger-description %} diff --git a/docs/tokens-tab/how-to-create-token-template.md b/docs/tokens-tab/how-to-create-token-template.md index 02667d6579..d70482d566 100644 --- a/docs/tokens-tab/how-to-create-token-template.md +++ b/docs/tokens-tab/how-to-create-token-template.md @@ -2,4 +2,4 @@ We have a new tab as Token for all Blocks. This tab is used to add token template and set value for each token option. These values will be filled by User if it is null. -
+
diff --git a/docs/trustchains-apis/building-and-returning.md b/docs/trustchains-apis/building-and-returning.md index b4701ba2e7..0fa8e09bdc 100644 --- a/docs/trustchains-apis/building-and-returning.md +++ b/docs/trustchains-apis/building-and-returning.md @@ -2,7 +2,7 @@ ### BUILDING AND RETURNING A TRUSTCHAIN -{% swagger method="get" path="" baseUrl="/trustchains/{hash}" summary="Returns a trustchain for a VP document" %} +{% swagger method="get" path="" baseUrl="/trust-chains/{hash}" summary="Returns a trustchain for a VP document" %} {% swagger-description %} Builds and returns a trustchain, from the VP to the root VC document. Only users with the Auditor role are allowed to make the request. {% endswagger-description %} diff --git a/docs/trustchains-apis/requesting.md b/docs/trustchains-apis/requesting.md index 73e763d105..93b5bba0d5 100644 --- a/docs/trustchains-apis/requesting.md +++ b/docs/trustchains-apis/requesting.md @@ -2,7 +2,7 @@ ### REQUESTS ALL VP DOCUMENTS -{% swagger method="get" path="" baseUrl="/trustchains" summary="Returns a list of all VP documents" %} +{% swagger method="get" path="" baseUrl="/trust-chains" summary="Returns a list of all VP documents" %} {% swagger-description %} Requests all VP documents. Only users with the Auditor role are allowed to make the request {% endswagger-description %} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ab15fe67e4..2c65fbf828 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "guardian", - "version": "2.12.0-prerelease", + "version": "2.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "guardian", - "version": "2.12.0-prerelease", + "version": "2.12.0", "license": "Apache-2.0", "dependencies": { "@angular-material-components/datetime-picker": "^6.0.3", @@ -35,6 +35,7 @@ "moment": "^2.29.2", "ngx-colors": "3.0.5", "ngx-file-drop": "^12.0.0", + "ngx-mask": "^12.0.0", "ngx-toastr": "^14.1.0", "process": "^0.11.10", "rxjs": "~6.6.0", @@ -60,8 +61,7 @@ } }, "../interfaces": { - "name": "@guardian/interfaces", - "version": "2.12.0-prerelease", + "version": "2.12.0", "license": "Apache-2.0", "dependencies": { "reflect-metadata": "^0.1.13" @@ -626,21 +626,21 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", + "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -688,7 +688,7 @@ "node_modules/@babel/core/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -711,7 +711,7 @@ "node_modules/@babel/generator/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -730,27 +730,27 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -770,18 +770,20 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -791,25 +793,35 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -819,17 +831,26 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", @@ -859,319 +880,319 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1180,9 +1201,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1192,14 +1213,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1226,13 +1247,13 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1242,13 +1263,13 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1259,12 +1280,12 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1275,12 +1296,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1291,12 +1312,12 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1307,12 +1328,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1323,12 +1344,12 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1339,12 +1360,12 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1355,16 +1376,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1374,12 +1395,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1390,13 +1411,13 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1407,13 +1428,13 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1423,14 +1444,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1441,25 +1462,25 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -1646,12 +1667,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1678,12 +1699,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1693,12 +1714,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1708,18 +1729,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -1730,24 +1752,25 @@ } }, "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1756,13 +1779,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1772,13 +1809,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1788,12 +1825,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1803,13 +1840,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1819,12 +1856,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1834,14 +1871,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1851,12 +1888,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1866,12 +1903,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1881,14 +1918,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1898,15 +1934,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1916,16 +1951,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1935,13 +1969,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1951,12 +1985,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1966,12 +2001,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1981,13 +2016,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1997,12 +2032,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -2012,12 +2047,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2027,12 +2062,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "dependencies": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" @@ -2042,12 +2078,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2086,12 +2122,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2101,13 +2137,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -2117,12 +2153,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2132,12 +2168,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2147,12 +2183,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2162,12 +2198,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -2177,13 +2213,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2304,6 +2340,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "node_modules/@babel/runtime": { "version": "7.14.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", @@ -2331,19 +2373,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2352,35 +2394,28 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2446,6 +2481,60 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@jsdevtools/coverage-istanbul-loader": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", @@ -2529,6 +2618,18 @@ "which": "^2.0.2" } }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/git/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2544,6 +2645,12 @@ "node": ">= 8" } }, + "node_modules/@npmcli/git/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", @@ -2564,6 +2671,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "mkdirp": "^1.0.4", @@ -2641,9 +2749,9 @@ } }, "node_modules/@types/codemirror": { - "version": "5.60.5", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.5.tgz", - "integrity": "sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==", + "version": "5.60.7", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.7.tgz", + "integrity": "sha512-QXIC+RPzt/1BGSuD6iFn6UMC9TDp+9hkOANYNPVsjjrDdzKphfRkwQDKGp2YaC54Yhz0g6P5uYTCCibZZEiMAA==", "dependencies": { "@types/tern": "*" } @@ -2655,15 +2763,18 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2671,9 +2782,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2681,9 +2792,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/file-saver": { "version": "2.0.5", @@ -2720,21 +2831,21 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "node_modules/@types/node": { - "version": "12.20.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.47.tgz", - "integrity": "sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -2942,9 +3053,9 @@ "dev": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/abbrev": { @@ -2967,9 +3078,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3004,13 +3115,13 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, "dependencies": { "debug": "^4.1.0", - "depd": "^1.1.2", + "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -3097,7 +3208,7 @@ "node_modules/ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", "dev": true, "engines": [ "node >= 0.8.0" @@ -3128,9 +3239,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -3157,9 +3268,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -3194,7 +3305,7 @@ "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3212,7 +3323,7 @@ "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3236,7 +3347,7 @@ "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3245,7 +3356,7 @@ "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3279,7 +3390,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { "node": ">=0.8" @@ -3288,26 +3399,32 @@ "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" } }, "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, "node_modules/async-limiter": { "version": "1.0.1", @@ -3318,7 +3435,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/atob": { @@ -3355,12 +3472,6 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/autoprefixer/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/autoprefixer/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -3390,16 +3501,16 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/babel-loader": { @@ -3422,9 +3533,9 @@ } }, "node_modules/babel-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -3434,9 +3545,9 @@ } }, "node_modules/babel-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -3447,15 +3558,6 @@ "node": ">=4.0.0" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", @@ -3531,7 +3633,7 @@ "node_modules/base/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -3572,13 +3674,13 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -3624,29 +3726,32 @@ } }, "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -3661,13 +3766,13 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, "dependencies": { "array-flatten": "^2.1.0", @@ -3681,7 +3786,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "node_modules/brace-expansion": { @@ -3709,7 +3814,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -3771,26 +3876,31 @@ } }, "node_modules/browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer": { @@ -3832,12 +3942,12 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, "node_modules/bytes": { @@ -3877,6 +3987,24 @@ "node": ">= 10" } }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -3941,14 +4069,24 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/canonical-path": { "version": "1.0.0", @@ -3959,7 +4097,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "node_modules/chalk": { @@ -4066,7 +4204,7 @@ "node_modules/class-utils/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -4078,7 +4216,7 @@ "node_modules/class-utils/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -4090,7 +4228,7 @@ "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -4102,7 +4240,7 @@ "node_modules/class-utils/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -4114,7 +4252,7 @@ "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -4168,9 +4306,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -4189,20 +4327,23 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -4225,21 +4366,21 @@ "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/codemirror": { - "version": "5.65.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.2.tgz", - "integrity": "sha512-SZM4Zq7XEC8Fhroqe3LxbEEX1zUPWH1wMr5zxiBuiUF64iYOUH/JI88v4tBag8MiBS8B8gRv8O1pPXGYXQ4ErA==" + "version": "5.65.13", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.13.tgz", + "integrity": "sha512-SVWEzKXmbHmTQQWaz03Shrh4nybG0wXx2MEu3FO4ezbPW8IbnZEd5iGHGEffSUaitKYa3i+pHpBsSvw8sPHtzg==" }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "dependencies": { "map-visit": "^1.0.0", @@ -4261,13 +4402,13 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, "node_modules/colorette": { @@ -4300,7 +4441,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/component-emitter": { @@ -4342,7 +4483,7 @@ "node_modules/compression/node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, "engines": { "node": ">= 0.8" @@ -4360,7 +4501,7 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/compression/node_modules/safe-buffer": { @@ -4372,7 +4513,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/connect": { @@ -4411,13 +4552,13 @@ "node_modules/connect/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "node_modules/content-disposition": { @@ -4433,27 +4574,18 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/cookie": { @@ -4468,7 +4600,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "node_modules/copy-anything": { @@ -4486,7 +4618,7 @@ "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4561,9 +4693,9 @@ "dev": true }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -4582,6 +4714,7 @@ "version": "3.15.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz", "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "dev": true, "hasInstallScript": true, "funding": { @@ -4590,32 +4723,22 @@ } }, "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" + "browserslist": "^4.21.5" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, "node_modules/cors": { @@ -4632,9 +4755,9 @@ } }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", @@ -4776,9 +4899,12 @@ } }, "node_modules/cronstrue": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.4.0.tgz", - "integrity": "sha512-KDJgE8XoT0Nupt1iljNGAQnxkfITwIYkL7mHrzH4a0AWyrj7Xk6GVCNPN3Avs7tU2yYoNuDculMKp9T3jysbPA==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.27.0.tgz", + "integrity": "sha512-p+w818EttA27EfIeZP5Z3k3ps9hy6DlRv3txbWxysTIlWEAE6DdYIjCaaeZhWaNfcowuXZrg0HVFWLTqGb85hg==", + "bin": { + "cronstrue": "bin/cli.js" + } }, "node_modules/cross-spawn": { "version": "6.0.5", @@ -4852,12 +4978,6 @@ "node": ">=6.0.0" } }, - "node_modules/css-blank-pseudo/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/css-blank-pseudo/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -4885,15 +5005,12 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", "dev": true, - "dependencies": { - "timsort": "^0.3.0" - }, "engines": { - "node": ">= 10" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" @@ -4927,12 +5044,6 @@ "node": ">=4" } }, - "node_modules/css-has-pseudo/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/css-has-pseudo/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -5033,9 +5144,9 @@ "dev": true }, "node_modules/css-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5115,9 +5226,9 @@ "dev": true }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5144,7 +5255,7 @@ "node_modules/css-parse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", "dev": true, "dependencies": { "css": "^2.0.0" @@ -5200,12 +5311,6 @@ "node": ">=6.0.0" } }, - "node_modules/css-prefers-color-scheme/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/css-prefers-color-scheme/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -5233,14 +5338,14 @@ } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, @@ -5271,9 +5376,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -5310,12 +5415,12 @@ } }, "node_modules/cssnano": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", - "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "dependencies": { - "cssnano-preset-default": "^*", + "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -5331,40 +5436,40 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", - "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^*", + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^*", - "postcss-convert-values": "^*", - "postcss-discard-comments": "^*", - "postcss-discard-duplicates": "^*", - "postcss-discard-empty": "^*", - "postcss-discard-overridden": "^*", - "postcss-merge-longhand": "^*", - "postcss-merge-rules": "^*", - "postcss-minify-font-values": "^*", - "postcss-minify-gradients": "^*", - "postcss-minify-params": "^*", - "postcss-minify-selectors": "^*", - "postcss-normalize-charset": "^*", - "postcss-normalize-display-values": "^*", - "postcss-normalize-positions": "^*", - "postcss-normalize-repeat-style": "^*", - "postcss-normalize-string": "^*", - "postcss-normalize-timing-functions": "^*", - "postcss-normalize-unicode": "^*", - "postcss-normalize-url": "^*", - "postcss-normalize-whitespace": "^*", - "postcss-ordered-values": "^*", - "postcss-reduce-initial": "^*", - "postcss-reduce-transforms": "^*", - "postcss-svgo": "^*", - "postcss-unique-selectors": "^*" + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -5400,13 +5505,13 @@ "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -5416,9 +5521,9 @@ } }, "node_modules/date-format": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", - "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, "engines": { "node": ">=4.0" @@ -5444,16 +5549,16 @@ "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -5490,12 +5595,15 @@ } }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-lazy-prop": { @@ -5508,15 +5616,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { @@ -5553,7 +5665,7 @@ "node_modules/del/node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "dependencies": { "array-uniq": "^1.0.1" @@ -5565,7 +5677,7 @@ "node_modules/del/node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "dependencies": { "array-union": "^1.0.1", @@ -5581,7 +5693,7 @@ "node_modules/del/node_modules/globby/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5620,7 +5732,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -5629,16 +5741,16 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/dependency-graph": { @@ -5660,10 +5772,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-node": { "version": "2.1.0", @@ -5674,7 +5790,7 @@ "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, "node_modules/diffie-hellman": { @@ -5707,7 +5823,7 @@ "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "node_modules/dns-packet": { @@ -5720,10 +5836,16 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/dns-packet/node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "node_modules/dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", "dev": true, "dependencies": { "buffer-indexof": "^1.0.0" @@ -5732,7 +5854,7 @@ "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "dependencies": { "custom-event": "~1.0.0", @@ -5742,9 +5864,9 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", @@ -5756,9 +5878,9 @@ } }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -5768,9 +5890,9 @@ ] }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -5799,7 +5921,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", @@ -5809,13 +5931,13 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "version": "1.4.407", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.407.tgz", + "integrity": "sha512-5smEvFSFYMv90tICOzRVP7Opp98DAC4KW7RRipg3BuNpGbbV3N+x24Zh3sbLb1T5haGtOSy/hrBfXsWnIM9aCg==", "dev": true }, "node_modules/elliptic": { @@ -5855,7 +5977,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "engines": { "node": ">= 0.8" @@ -5894,9 +6016,9 @@ } }, "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -5908,16 +6030,16 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5939,7 +6061,7 @@ "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "dev": true }, "node_modules/entities": { @@ -6005,13 +6127,13 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -6072,7 +6194,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -6094,15 +6216,12 @@ } }, "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "dev": true, - "dependencies": { - "original": "^1.0.0" - }, "engines": { - "node": ">=0.12.0" + "node": ">=12.0.0" } }, "node_modules/evp_bytestokey": { @@ -6135,7 +6254,7 @@ "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "dependencies": { "debug": "^2.3.3", @@ -6162,7 +6281,7 @@ "node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -6174,7 +6293,7 @@ "node_modules/expand-brackets/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -6186,7 +6305,7 @@ "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -6198,7 +6317,7 @@ "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -6210,7 +6329,7 @@ "node_modules/expand-brackets/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -6222,7 +6341,7 @@ "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -6248,7 +6367,7 @@ "node_modules/expand-brackets/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6266,42 +6385,43 @@ "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -6313,9 +6433,42 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6325,12 +6478,54 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6340,7 +6535,7 @@ "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -6386,7 +6581,7 @@ "node_modules/extglob/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -6398,7 +6593,7 @@ "node_modules/extglob/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -6410,7 +6605,7 @@ "node_modules/extglob/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6419,7 +6614,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -6431,9 +6626,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6453,9 +6648,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6542,9 +6737,21 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -6576,9 +6783,9 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/flatten": { @@ -6589,9 +6796,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -6611,7 +6818,7 @@ "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6620,7 +6827,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { "node": "*" @@ -6652,7 +6859,7 @@ "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "dependencies": { "map-cache": "^0.2.2" @@ -6664,24 +6871,24 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { @@ -6705,7 +6912,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { @@ -6728,10 +6935,19 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", "dev": true, "dependencies": { "aproba": "^1.0.3", @@ -6747,7 +6963,7 @@ "node_modules/gauge/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6756,7 +6972,7 @@ "node_modules/gauge/node_modules/is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "dependencies": { "number-is-nan": "^1.0.0" @@ -6768,7 +6984,7 @@ "node_modules/gauge/node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "dependencies": { "code-point-at": "^1.0.0", @@ -6782,7 +6998,7 @@ "node_modules/gauge/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -6810,14 +7026,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6838,7 +7055,7 @@ "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6847,7 +7064,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -6921,9 +7138,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/handle-thing": { @@ -6935,7 +7152,7 @@ "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, "engines": { "node": ">=4" @@ -6992,12 +7209,36 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -7028,13 +7269,13 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "dependencies": { "get-value": "^2.0.6", @@ -7048,7 +7289,7 @@ "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -7061,7 +7302,7 @@ "node_modules/has-values/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -7073,7 +7314,7 @@ "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -7085,7 +7326,7 @@ "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -7119,7 +7360,7 @@ "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -7138,10 +7379,28 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -7151,9 +7410,9 @@ } }, "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -7193,37 +7452,46 @@ "dev": true }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "node_modules/http-proxy": { @@ -7293,7 +7561,7 @@ "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -7305,7 +7573,7 @@ "node_modules/http-proxy-middleware/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -7320,7 +7588,7 @@ "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -7332,7 +7600,7 @@ "node_modules/http-proxy-middleware/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7341,7 +7609,7 @@ "node_modules/http-proxy-middleware/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -7353,7 +7621,7 @@ "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -7389,7 +7657,7 @@ "node_modules/http-proxy-middleware/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -7402,7 +7670,7 @@ "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { "assert-plus": "^1.0.0", @@ -7430,7 +7698,7 @@ "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "dependencies": { "ms": "^2.0.0" @@ -7481,9 +7749,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -7501,7 +7769,7 @@ "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true, "bin": { @@ -7598,7 +7866,7 @@ "node_modules/import-local/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" @@ -7619,7 +7887,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -7637,7 +7905,7 @@ "node_modules/indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", "dev": true }, "node_modules/infer-owner": { @@ -7649,7 +7917,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -7779,15 +8047,15 @@ } }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true, "engines": { "node": ">=4" @@ -7842,7 +8110,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-binary-path": { @@ -7864,9 +8132,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7946,7 +8214,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7985,7 +8253,7 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "node_modules/is-number": { @@ -8061,7 +8329,7 @@ "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8070,7 +8338,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-unicode-supported": { @@ -8115,13 +8383,13 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "engines": { "node": ">= 8.0.0" @@ -8133,13 +8401,13 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8148,7 +8416,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "node_modules/istanbul-lib-coverage": { @@ -8243,9 +8511,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8319,7 +8587,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "node_modules/jsesc": { @@ -8360,17 +8628,14 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -8385,13 +8650,10 @@ "dev": true }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -8399,7 +8661,7 @@ "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -8421,9 +8683,9 @@ } }, "node_modules/karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "version": "6.3.20", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", + "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -8445,7 +8707,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -8485,9 +8747,9 @@ } }, "node_modules/karma-jasmine": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", - "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", "dev": true, "dependencies": { "jasmine-core": "^3.6.0" @@ -8519,13 +8781,24 @@ "source-map-support": "^0.5.5" } }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -8595,9 +8868,9 @@ } }, "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "engines": { "node": ">= 8" @@ -8728,9 +9001,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" @@ -8743,9 +9016,9 @@ "dev": true }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { "node": ">=6.11.5" @@ -8786,19 +9059,19 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/log-symbols": { @@ -8888,25 +9161,25 @@ } }, "node_modules/log4js": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", - "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "dependencies": { - "date-format": "^4.0.4", - "debug": "^4.3.3", - "flatted": "^3.2.5", + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.0.4" + "streamroller": "^3.1.5" }, "engines": { "node": ">=8.0" } }, "node_modules/log4js/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -8921,9 +9194,9 @@ } }, "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "dev": true, "engines": { "node": ">= 0.6.0" @@ -8934,15 +9207,12 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/magic-string": { @@ -9005,6 +9275,24 @@ "node": ">= 10" } }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -9020,7 +9308,7 @@ "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9029,7 +9317,7 @@ "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "dependencies": { "object-visit": "^1.0.0" @@ -9057,7 +9345,7 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "engines": { "node": ">= 0.6" @@ -9089,12 +9377,12 @@ } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -9103,7 +9391,7 @@ "node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "dependencies": { "errno": "^0.1.3", @@ -9111,9 +9399,9 @@ } }, "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -9143,7 +9431,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "node_modules/merge-source-map": { @@ -9182,20 +9470,20 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -9313,9 +9601,9 @@ "dev": true }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -9338,7 +9626,7 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "3.0.4", @@ -9353,15 +9641,18 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -9445,6 +9736,12 @@ "node": ">=8" } }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -9458,6 +9755,12 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -9513,7 +9816,7 @@ "node_modules/multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", "dev": true }, "node_modules/mute-stream": { @@ -9523,17 +9826,23 @@ "dev": true }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "dev": true, "optional": true }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9636,16 +9945,29 @@ "@angular/core": ">=12.0.0" } }, - "node_modules/ngx-toastr": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.2.2.tgz", - "integrity": "sha512-/Ajr9E0llr51Zij8WgnxQpe7a5JK+k1n07/uWJcQ112OBH0GCktHi8M8QfGvw5Ih67hG8iowrT+aHXHS49gZcQ==", + "node_modules/ngx-mask": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-12.0.0.tgz", + "integrity": "sha512-q4vUjhjJfg4faRud/tUdCTOs3JA6B+rBB2OPZ2xBZy4LNTRKGfUK683LrDCitMVBezjEAVrkQdUT1I4C7LXBZQ==", "dependencies": { - "tslib": "^2.3.0" + "tslib": "^2.1.0" }, "peerDependencies": { - "@angular/common": ">=12.0.0-0", - "@angular/core": ">=12.0.0-0", + "@angular/common": ">=10.0.0", + "@angular/core": ">=10.0.0", + "@angular/forms": ">=10.0.0" + } + }, + "node_modules/ngx-toastr": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.3.0.tgz", + "integrity": "sha512-d8j/sOr60w5U7rGlcKQ0Ff4u+m2NzhqU5ZdJXn7QW3aR3Zf/rY7/Fd14BmUindTOWVr2NeTYcQXCjLpir0ldpA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0-0", + "@angular/core": ">=12.0.0-0", "@angular/platform-browser": ">=12.0.0-0" } }, @@ -9688,21 +10010,6 @@ "node": ">= 10.12.0" } }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/node-gyp/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9719,11 +10026,26 @@ } }, "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9736,7 +10058,7 @@ "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9795,6 +10117,24 @@ "node": ">=10" } }, + "node_modules/npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-pick-manifest": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", @@ -9827,7 +10167,7 @@ "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { "path-key": "^2.0.0" @@ -9849,9 +10189,9 @@ } }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" @@ -9863,13 +10203,13 @@ "node_modules/num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", "dev": true }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9887,7 +10227,7 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9896,7 +10236,7 @@ "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", @@ -9910,7 +10250,7 @@ "node_modules/object-copy/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -9922,7 +10262,7 @@ "node_modules/object-copy/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -9934,7 +10274,7 @@ "node_modules/object-copy/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -9969,7 +10309,7 @@ "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -9978,6 +10318,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -10006,7 +10355,7 @@ "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "dependencies": { "isobject": "^3.0.0" @@ -10015,28 +10364,10 @@ "node": ">=0.10.0" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "dependencies": { "isobject": "^3.0.1" @@ -10052,9 +10383,9 @@ "dev": true }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -10075,7 +10406,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -10128,7 +10459,7 @@ "node_modules/opn/node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, "engines": { "node": ">=4" @@ -10227,19 +10558,10 @@ "node": ">=8" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "dependencies": { - "url-parse": "^1.4.3" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10248,7 +10570,7 @@ "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true, "engines": { "node": ">=4" @@ -10257,7 +10579,7 @@ "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, "engines": { "node": ">=4" @@ -10374,24 +10696,6 @@ "node": ">=10" } }, - "node_modules/pacote/node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10507,7 +10811,7 @@ "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10516,7 +10820,7 @@ "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "node_modules/path-exists": { @@ -10531,7 +10835,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10540,13 +10844,13 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" @@ -10561,7 +10865,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/path-type": { @@ -10591,13 +10895,13 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, "node_modules/picomatch": { @@ -10615,7 +10919,7 @@ "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10624,7 +10928,7 @@ "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10633,7 +10937,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { "pinkie": "^2.0.0" @@ -10655,14 +10959,14 @@ } }, "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "engines": { "node": ">= 0.12.0" @@ -10678,12 +10982,12 @@ } }, "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -10692,7 +10996,7 @@ "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10726,12 +11030,6 @@ "postcss-selector-parser": "^6.0.2" } }, - "node_modules/postcss-attribute-case-insensitive/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10784,12 +11082,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-color-functional-notation/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-color-functional-notation/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10830,12 +11122,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-color-gray/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-color-gray/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10875,12 +11161,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-color-hex-alpha/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-color-hex-alpha/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10921,12 +11201,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-color-mod-function/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-color-mod-function/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10966,12 +11240,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-color-rebeccapurple/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-color-rebeccapurple/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10999,12 +11267,12 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -11017,11 +11285,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "dependencies": { + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -11043,12 +11312,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-custom-media/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-custom-media/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11088,12 +11351,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-custom-properties/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-custom-properties/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11145,12 +11402,6 @@ "node": ">=4" } }, - "node_modules/postcss-custom-selectors/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-custom-selectors/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11216,12 +11467,6 @@ "node": ">=4" } }, - "node_modules/postcss-dir-pseudo-class/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11263,9 +11508,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -11323,12 +11568,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-double-position-gradients/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-double-position-gradients/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11368,12 +11607,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-env-function/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-env-function/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11412,12 +11645,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-focus-visible/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-focus-visible/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11456,12 +11683,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-focus-within/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-focus-within/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11497,12 +11718,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-font-variant/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-font-variant/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11541,12 +11756,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-gap-properties/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-gap-properties/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11586,12 +11795,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-image-set-function/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-image-set-function/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11644,12 +11847,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-initial/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-initial/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11690,12 +11887,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-lab-function/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-lab-function/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11756,12 +11947,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-logical/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-logical/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11800,12 +11985,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-media-minmax/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-media-minmax/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11833,13 +12012,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", - "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^*" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -11849,12 +12028,12 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", - "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -11882,9 +12061,9 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", - "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, "dependencies": { "colord": "^2.9.1", @@ -11899,12 +12078,12 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", - "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -11916,9 +12095,9 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" @@ -11943,9 +12122,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -12001,12 +12180,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-nesting/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-nesting/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12061,9 +12234,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -12076,9 +12249,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -12121,12 +12294,12 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -12168,9 +12341,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", - "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, "dependencies": { "cssnano-utils": "^3.1.0", @@ -12195,12 +12368,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-overflow-shorthand/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-overflow-shorthand/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12236,12 +12403,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-page-break/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-page-break/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12281,12 +12442,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-place/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-place/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12361,12 +12516,6 @@ "node": ">=6.0.0" } }, - "node_modules/postcss-preset-env/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-preset-env/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12418,12 +12567,6 @@ "node": ">=4" } }, - "node_modules/postcss-pseudo-class-any-link/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12465,12 +12608,12 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -12504,12 +12647,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-replace-overflow-wrap/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12546,12 +12683,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-selector-matches/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-selector-matches/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12588,12 +12719,6 @@ "postcss": "^7.0.2" } }, - "node_modules/postcss-selector-not/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/postcss-selector-not/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -12621,9 +12746,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -12699,7 +12824,7 @@ "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } @@ -12713,7 +12838,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "node_modules/promise-retry": { @@ -12745,13 +12870,13 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/public-encrypt": { @@ -12783,9 +12908,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } @@ -12800,10 +12925,13 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -12814,7 +12942,7 @@ "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { @@ -12874,13 +13002,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -12940,9 +13068,9 @@ "dev": true }, "node_modules/raw-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -12960,7 +13088,7 @@ "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "dependencies": { "pify": "^2.3.0" @@ -12980,9 +13108,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13017,9 +13145,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -13035,9 +13163,9 @@ "dev": true }, "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -13063,13 +13191,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -13079,32 +13208,26 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -13116,7 +13239,7 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -13125,7 +13248,7 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "node_modules/repeat-element": { @@ -13140,7 +13263,7 @@ "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, "engines": { "node": ">=0.10" @@ -13200,7 +13323,7 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -13223,7 +13346,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { @@ -13242,7 +13365,7 @@ "node_modules/resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, "dependencies": { "resolve-from": "^3.0.0" @@ -13254,7 +13377,7 @@ "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "engines": { "node": ">=4" @@ -13272,7 +13395,7 @@ "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, @@ -13304,12 +13427,6 @@ } } }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "node_modules/resolve-url-loader/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -13361,7 +13478,7 @@ "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "engines": { "node": ">= 4" @@ -13477,7 +13594,7 @@ "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "dependencies": { "ret": "~0.1.10" @@ -13595,7 +13712,7 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "node_modules/selfsigned": { @@ -13622,25 +13739,43 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -13658,7 +13793,7 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/send/node_modules/mime": { @@ -13679,6 +13814,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", @@ -13691,7 +13835,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -13715,10 +13859,19 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -13733,13 +13886,13 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { @@ -13749,15 +13902,15 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -13766,7 +13919,7 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "node_modules/set-value": { @@ -13787,7 +13940,7 @@ "node_modules/set-value/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -13799,7 +13952,7 @@ "node_modules/set-value/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -13838,7 +13991,7 @@ "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" @@ -13850,12 +14003,26 @@ "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -13917,7 +14084,7 @@ "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -13941,7 +14108,7 @@ "node_modules/snapdragon-util/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -13962,7 +14129,7 @@ "node_modules/snapdragon/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -13974,7 +14141,7 @@ "node_modules/snapdragon/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -13986,7 +14153,7 @@ "node_modules/snapdragon/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -13998,7 +14165,7 @@ "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -14010,7 +14177,7 @@ "node_modules/snapdragon/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -14022,7 +14189,7 @@ "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -14048,7 +14215,7 @@ "node_modules/snapdragon/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -14066,13 +14233,13 @@ "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/snapdragon/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -14093,32 +14260,35 @@ } }, "node_modules/socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -14129,9 +14299,9 @@ } }, "node_modules/socket.io/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -14157,13 +14327,13 @@ } }, "node_modules/sockjs-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", - "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "dependencies": { "debug": "^3.2.7", - "eventsource": "^1.1.0", + "eventsource": "^2.0.2", "faye-websocket": "^0.11.4", "inherits": "^2.0.4", "url-parse": "^1.5.10" @@ -14185,12 +14355,12 @@ } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -14199,19 +14369,36 @@ } }, "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" } }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -14310,6 +14497,7 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, "node_modules/spdy": { @@ -14395,12 +14583,13 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "dependencies": { "define-property": "^0.2.5", @@ -14413,7 +14602,7 @@ "node_modules/static-extend/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -14425,7 +14614,7 @@ "node_modules/static-extend/node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -14437,7 +14626,7 @@ "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -14449,7 +14638,7 @@ "node_modules/static-extend/node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -14461,7 +14650,7 @@ "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -14496,7 +14685,7 @@ "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "engines": { "node": ">= 0.6" @@ -14512,23 +14701,23 @@ } }, "node_modules/streamroller": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", - "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "date-format": "^4.0.5", - "debug": "^4.3.3", - "fs-extra": "^10.0.1" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { "node": ">=8.0" } }, "node_modules/streamroller/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -14579,7 +14768,7 @@ "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -14637,9 +14826,9 @@ "dev": true }, "node_modules/style-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -14655,12 +14844,12 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -14726,7 +14915,7 @@ "node_modules/stylus/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/stylus/node_modules/semver": { @@ -14771,6 +14960,12 @@ "node": ">=10.13.0" } }, + "node_modules/svgo/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -14790,22 +14985,37 @@ } }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/terser": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", @@ -14879,9 +15089,9 @@ "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -14914,13 +15124,13 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/thunky": { @@ -14929,12 +15139,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -14950,7 +15154,7 @@ "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" @@ -14959,7 +15163,7 @@ "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -14971,7 +15175,7 @@ "node_modules/to-object-path/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -15039,14 +15243,14 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -15058,7 +15262,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-fest": { @@ -15100,9 +15304,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "dev": true, "funding": [ { @@ -15141,18 +15345,18 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" @@ -15176,7 +15380,7 @@ "node_modules/union-value/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15185,7 +15389,7 @@ "node_modules/uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true }, "node_modules/unique-filename": { @@ -15207,18 +15411,18 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "engines": { "node": ">= 0.8" @@ -15227,7 +15431,7 @@ "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "dependencies": { "has-value": "^0.3.1", @@ -15240,7 +15444,7 @@ "node_modules/unset-value/node_modules/has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "dependencies": { "get-value": "^2.0.3", @@ -15254,7 +15458,7 @@ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "dependencies": { "isarray": "1.0.0" @@ -15266,7 +15470,7 @@ "node_modules/unset-value/node_modules/has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15282,6 +15486,42 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15293,14 +15533,14 @@ "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dev": true, "dependencies": { "punycode": "1.3.2", @@ -15320,7 +15560,7 @@ "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true }, "node_modules/use": { @@ -15335,12 +15575,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "engines": { "node": ">= 0.4.0" @@ -15358,7 +15598,7 @@ "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "dependencies": { "builtins": "^1.0.3" @@ -15367,7 +15607,7 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" @@ -15376,7 +15616,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -15390,16 +15630,16 @@ "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -15421,7 +15661,7 @@ "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { "defaults": "^1.0.3" @@ -15529,9 +15769,9 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -15629,7 +15869,7 @@ "node_modules/webpack-dev-server/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15648,7 +15888,7 @@ "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -15690,7 +15930,7 @@ "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -15763,7 +16003,7 @@ "node_modules/webpack-dev-server/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -15778,7 +16018,7 @@ "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -15803,7 +16043,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, "hasInstallScript": true, "optional": true, @@ -15821,7 +16061,7 @@ "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "dependencies": { "is-glob": "^3.1.0", @@ -15831,7 +16071,7 @@ "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, "dependencies": { "is-extglob": "^2.1.0" @@ -15840,10 +16080,16 @@ "node": ">=0.10.0" } }, + "node_modules/webpack-dev-server/node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -15855,7 +16101,7 @@ "node_modules/webpack-dev-server/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15864,7 +16110,7 @@ "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { "node": ">=4" @@ -15873,7 +16119,7 @@ "node_modules/webpack-dev-server/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -15885,7 +16131,7 @@ "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -15938,12 +16184,12 @@ } }, "node_modules/webpack-dev-server/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -15979,16 +16225,16 @@ "node_modules/webpack-dev-server/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -16090,7 +16336,7 @@ "node_modules/webpack-dev-server/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -16114,7 +16360,7 @@ "node_modules/webpack-dev-server/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -16344,9 +16590,9 @@ "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -16419,9 +16665,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "node_modules/wide-align": { @@ -16434,9 +16680,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/wrap-ansi": { @@ -16492,13 +16738,13 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -16526,9 +16772,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { @@ -16541,27 +16787,27 @@ } }, "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -16580,9 +16826,9 @@ } }, "node_modules/zone.js": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", - "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", + "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", "dependencies": { "tslib": "^2.3.0" } @@ -16931,18 +17177,18 @@ } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", + "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", "dev": true }, "@babel/core": { @@ -16977,7 +17223,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true } } @@ -16996,7 +17242,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true } } @@ -17011,24 +17257,24 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { @@ -17041,49 +17287,64 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -17112,276 +17373,275 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "dev": true }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "dependencies": { "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } } } }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "dependencies": { "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } } } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } } } }, "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "dependencies": { + "@babel/template": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" + } + } } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.21.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "dependencies": { "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } } } }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "dependencies": { "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } } } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -17396,161 +17656,161 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { @@ -17680,12 +17940,12 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-async-to-generator": { @@ -17700,243 +17960,257 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" + } + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { @@ -17962,68 +18236,68 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { @@ -18128,6 +18402,12 @@ "esutils": "^2.0.2" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "@babel/runtime": { "version": "7.14.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", @@ -18149,49 +18429,45 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", "dev": true, "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -18243,6 +18519,53 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, "@jsdevtools/coverage-istanbul-loader": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", @@ -18307,6 +18630,15 @@ "which": "^2.0.2" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -18315,6 +18647,12 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -18395,9 +18733,9 @@ "dev": true }, "@types/codemirror": { - "version": "5.60.5", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.5.tgz", - "integrity": "sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==", + "version": "5.60.7", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.7.tgz", + "integrity": "sha512-QXIC+RPzt/1BGSuD6iFn6UMC9TDp+9hkOANYNPVsjjrDdzKphfRkwQDKGp2YaC54Yhz0g6P5uYTCCibZZEiMAA==", "requires": { "@types/tern": "*" } @@ -18409,15 +18747,18 @@ "dev": true }, "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "requires": { "@types/estree": "*", @@ -18425,9 +18766,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -18435,9 +18776,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@types/file-saver": { "version": "2.0.5", @@ -18473,21 +18814,21 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/node": { - "version": "12.20.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.47.tgz", - "integrity": "sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "@types/parse-json": { @@ -18694,9 +19035,9 @@ "dev": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "abbrev": { @@ -18716,9 +19057,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "adjust-sourcemap-loader": { @@ -18741,13 +19082,13 @@ } }, "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, "requires": { "debug": "^4.1.0", - "depd": "^1.1.2", + "depd": "^2.0.0", "humanize-ms": "^1.2.1" } }, @@ -18805,7 +19146,7 @@ "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", "dev": true }, "ansi-regex": { @@ -18824,9 +19165,9 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -18850,9 +19191,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -18889,7 +19230,7 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true }, "arr-flatten": { @@ -18901,7 +19242,7 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true }, "array-flatten": { @@ -18919,13 +19260,13 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true }, "asn1": { @@ -18958,28 +19299,28 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" } }, "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", "dev": true }, "async-limiter": { @@ -18991,7 +19332,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "atob": { @@ -19015,12 +19356,6 @@ "postcss-value-parser": "^4.1.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -19042,13 +19377,13 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "babel-loader": { @@ -19064,18 +19399,18 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -19085,15 +19420,6 @@ } } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, "babel-plugin-polyfill-corejs2": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", @@ -19156,7 +19482,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -19179,13 +19505,13 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -19225,26 +19551,28 @@ } }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -19259,7 +19587,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -19267,7 +19595,7 @@ "bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, "requires": { "array-flatten": "^2.1.0", @@ -19281,7 +19609,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { @@ -19306,7 +19634,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "browserify-aes": { "version": "1.2.0", @@ -19368,16 +19696,15 @@ } }, "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer": { @@ -19405,12 +19732,12 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, "bytes": { @@ -19442,6 +19769,23 @@ "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "cache-base": { @@ -19496,9 +19840,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", "dev": true }, "canonical-path": { @@ -19510,7 +19854,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chalk": { @@ -19589,7 +19933,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -19598,7 +19942,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -19607,7 +19951,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -19618,7 +19962,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -19627,7 +19971,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -19670,9 +20014,9 @@ } }, "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true }, "cli-width": { @@ -19682,20 +20026,20 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-deep": { @@ -19712,18 +20056,18 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true }, "codemirror": { - "version": "5.65.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.2.tgz", - "integrity": "sha512-SZM4Zq7XEC8Fhroqe3LxbEEX1zUPWH1wMr5zxiBuiUF64iYOUH/JI88v4tBag8MiBS8B8gRv8O1pPXGYXQ4ErA==" + "version": "5.65.13", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.13.tgz", + "integrity": "sha512-SVWEzKXmbHmTQQWaz03Shrh4nybG0wXx2MEu3FO4ezbPW8IbnZEd5iGHGEffSUaitKYa3i+pHpBsSvw8sPHtzg==" }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "requires": { "map-visit": "^1.0.0", @@ -19742,13 +20086,13 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, "colorette": { @@ -19775,7 +20119,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "component-emitter": { @@ -19811,7 +20155,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true }, "debug": { @@ -19826,7 +20170,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "safe-buffer": { @@ -19840,7 +20184,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "connect": { @@ -19867,7 +20211,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -19881,7 +20225,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "content-disposition": { @@ -19894,27 +20238,16 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cookie": { "version": "0.4.2", @@ -19925,7 +20258,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-anything": { @@ -19940,7 +20273,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true }, "copy-webpack-plugin": { @@ -19993,9 +20326,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -20012,27 +20345,18 @@ "dev": true }, "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", - "dev": true, - "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "dev": true, + "requires": { + "browserslist": "^4.21.5" } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, "cors": { @@ -20046,9 +20370,9 @@ } }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -20170,9 +20494,9 @@ } }, "cronstrue": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.4.0.tgz", - "integrity": "sha512-KDJgE8XoT0Nupt1iljNGAQnxkfITwIYkL7mHrzH4a0AWyrj7Xk6GVCNPN3Avs7tU2yYoNuDculMKp9T3jysbPA==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.27.0.tgz", + "integrity": "sha512-p+w818EttA27EfIeZP5Z3k3ps9hy6DlRv3txbWxysTIlWEAE6DdYIjCaaeZhWaNfcowuXZrg0HVFWLTqGb85hg==" }, "cross-spawn": { "version": "6.0.5", @@ -20241,12 +20565,6 @@ "postcss": "^7.0.5" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -20266,13 +20584,11 @@ } }, "css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", "dev": true, - "requires": { - "timsort": "^0.3.0" - } + "requires": {} }, "css-has-pseudo": { "version": "0.10.0", @@ -20290,12 +20606,6 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -20369,9 +20679,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -20422,9 +20732,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -20443,7 +20753,7 @@ "css-parse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", "dev": true, "requires": { "css": "^2.0.0" @@ -20491,12 +20801,6 @@ "postcss": "^7.0.5" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -20516,14 +20820,14 @@ } }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } @@ -20547,9 +20851,9 @@ } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssdb": { @@ -20565,51 +20869,51 @@ "dev": true }, "cssnano": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", - "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "requires": { - "cssnano-preset-default": "^*", + "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", - "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, "requires": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^*", + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^*", - "postcss-convert-values": "^*", - "postcss-discard-comments": "^*", - "postcss-discard-duplicates": "^*", - "postcss-discard-empty": "^*", - "postcss-discard-overridden": "^*", - "postcss-merge-longhand": "^*", - "postcss-merge-rules": "^*", - "postcss-minify-font-values": "^*", - "postcss-minify-gradients": "^*", - "postcss-minify-params": "^*", - "postcss-minify-selectors": "^*", - "postcss-normalize-charset": "^*", - "postcss-normalize-display-values": "^*", - "postcss-normalize-positions": "^*", - "postcss-normalize-repeat-style": "^*", - "postcss-normalize-string": "^*", - "postcss-normalize-timing-functions": "^*", - "postcss-normalize-unicode": "^*", - "postcss-normalize-url": "^*", - "postcss-normalize-whitespace": "^*", - "postcss-ordered-values": "^*", - "postcss-reduce-initial": "^*", - "postcss-reduce-transforms": "^*", - "postcss-svgo": "^*", - "postcss-unique-selectors": "^*" + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { @@ -20631,22 +20935,22 @@ "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "date-format": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", - "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true }, "debug": { @@ -20661,13 +20965,13 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "deep-equal": { @@ -20695,9 +20999,9 @@ } }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -20710,12 +21014,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "define-property": { @@ -20746,7 +21051,7 @@ "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -20755,7 +21060,7 @@ "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "requires": { "array-union": "^1.0.1", @@ -20768,7 +21073,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } @@ -20799,19 +21104,19 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "dependency-graph": { @@ -20830,9 +21135,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-node": { @@ -20844,7 +21149,7 @@ "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, "diffie-hellman": { @@ -20876,7 +21181,7 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { @@ -20887,12 +21192,20 @@ "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" + }, + "dependencies": { + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + } } }, "dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", "dev": true, "requires": { "buffer-indexof": "^1.0.0" @@ -20901,7 +21214,7 @@ "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "requires": { "custom-event": "~1.0.0", @@ -20911,9 +21224,9 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -20922,15 +21235,15 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -20950,7 +21263,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -20960,13 +21273,13 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "version": "1.4.407", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.407.tgz", + "integrity": "sha512-5smEvFSFYMv90tICOzRVP7Opp98DAC4KW7RRipg3BuNpGbbV3N+x24Zh3sbLb1T5haGtOSy/hrBfXsWnIM9aCg==", "dev": true }, "elliptic": { @@ -21005,7 +21318,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "encoding": { @@ -21040,9 +21353,9 @@ } }, "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -21054,13 +21367,13 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" } }, "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", "dev": true }, "enhanced-resolve": { @@ -21076,7 +21389,7 @@ "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "dev": true }, "entities": { @@ -21130,13 +21443,13 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "eslint-scope": { @@ -21181,7 +21494,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter3": { @@ -21197,13 +21510,10 @@ "dev": true }, "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true }, "evp_bytestokey": { "version": "1.0.3", @@ -21232,7 +21542,7 @@ "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "requires": { "debug": "^2.3.3", @@ -21256,7 +21566,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -21265,7 +21575,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -21274,7 +21584,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -21283,7 +21593,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -21294,7 +21604,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -21303,7 +21613,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -21325,7 +21635,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true }, "kind-of": { @@ -21337,44 +21647,45 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -21383,7 +21694,33 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "debug": { @@ -21395,10 +21732,43 @@ "ms": "2.0.0" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -21412,7 +21782,7 @@ "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "requires": { "assign-symbols": "^1.0.0", @@ -21449,7 +21819,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -21458,7 +21828,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -21467,7 +21837,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true } } @@ -21475,7 +21845,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -21484,9 +21854,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -21503,9 +21873,9 @@ "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -21577,8 +21947,17 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -21604,9 +21983,9 @@ } }, "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "flatten": { @@ -21616,21 +21995,21 @@ "dev": true }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -21653,7 +22032,7 @@ "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "requires": { "map-cache": "^0.2.2" @@ -21662,18 +22041,18 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-minipass": { @@ -21694,7 +22073,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -21710,10 +22089,16 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", "dev": true, "requires": { "aproba": "^1.0.3", @@ -21729,13 +22114,13 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -21744,7 +22129,7 @@ "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -21755,7 +22140,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -21776,14 +22161,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-stream": { @@ -21798,13 +22184,13 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -21860,9 +22246,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "handle-thing": { @@ -21874,7 +22260,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { @@ -21919,7 +22305,22 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true }, "has-symbols": { @@ -21940,13 +22341,13 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "requires": { "get-value": "^2.0.6", @@ -21957,7 +22358,7 @@ "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -21967,7 +22368,7 @@ "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -21976,7 +22377,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -21987,7 +22388,7 @@ "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -22017,7 +22418,7 @@ "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -22031,12 +22432,29 @@ "dev": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -22046,9 +22464,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -22090,34 +22508,42 @@ "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -22175,7 +22601,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -22186,7 +22612,7 @@ "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -22198,7 +22624,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -22209,13 +22635,13 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -22224,7 +22650,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -22256,7 +22682,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -22268,7 +22694,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -22289,7 +22715,7 @@ "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" @@ -22318,9 +22744,9 @@ "dev": true }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "ignore-walk": { @@ -22335,7 +22761,7 @@ "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true }, @@ -22399,7 +22825,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "pkg-dir": { @@ -22416,7 +22842,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { @@ -22428,7 +22854,7 @@ "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", "dev": true }, "infer-owner": { @@ -22440,7 +22866,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -22542,15 +22968,15 @@ } }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true }, "ipaddr.js": { @@ -22587,7 +23013,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-binary-path": { @@ -22606,9 +23032,9 @@ "dev": true }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -22661,7 +23087,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -22688,7 +23114,7 @@ "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "is-number": { @@ -22743,13 +23169,13 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -22782,31 +23208,31 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-lib-coverage": { @@ -22883,9 +23309,9 @@ } }, "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -22943,7 +23369,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "jsesc": { @@ -22978,17 +23404,14 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonc-parser": { "version": "3.0.0", @@ -22997,19 +23420,18 @@ "dev": true }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "graceful-fs": "^4.1.6" } }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsprim": { @@ -23025,9 +23447,9 @@ } }, "karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "version": "6.3.20", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", + "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -23049,20 +23471,31 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" }, "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "source-map": { @@ -23127,9 +23560,9 @@ } }, "karma-jasmine": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", - "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", "dev": true, "requires": { "jasmine-core": "^3.6.0" @@ -23164,9 +23597,9 @@ "dev": true }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true }, "less": { @@ -23254,9 +23687,9 @@ } }, "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, "lines-and-columns": { @@ -23266,9 +23699,9 @@ "dev": true }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { @@ -23300,19 +23733,19 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "log-symbols": { @@ -23377,22 +23810,22 @@ } }, "log4js": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", - "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "requires": { - "date-format": "^4.0.4", - "debug": "^4.3.3", - "flatted": "^3.2.5", + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.0.4" + "streamroller": "^3.1.5" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -23401,18 +23834,18 @@ } }, "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "dev": true }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "^4.0.0" + "yallist": "^3.0.2" } }, "magic-string": { @@ -23463,6 +23896,23 @@ "promise-retry": "^2.0.1", "socks-proxy-agent": "^6.0.0", "ssri": "^8.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "map-age-cleaner": { @@ -23477,13 +23927,13 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "requires": { "object-visit": "^1.0.0" @@ -23508,7 +23958,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "mem": { @@ -23530,18 +23980,18 @@ } }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "requires": { "errno": "^0.1.3", @@ -23549,9 +23999,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -23583,7 +24033,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-source-map": { @@ -23618,17 +24068,17 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "miller-rabin": { @@ -23711,9 +24161,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -23731,7 +24181,7 @@ "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "minimatch": { "version": "3.0.4", @@ -23743,18 +24193,26 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "requires": { "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "minipass-collect": { @@ -23823,6 +24281,14 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "mixin-deep": { @@ -23865,7 +24331,7 @@ "multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", "dev": true }, "mute-stream": { @@ -23875,16 +24341,16 @@ "dev": true }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "dev": true, "optional": true }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "nanomatch": { @@ -23958,10 +24424,18 @@ "tslib": "^2.0.0" } }, + "ngx-mask": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-12.0.0.tgz", + "integrity": "sha512-q4vUjhjJfg4faRud/tUdCTOs3JA6B+rBB2OPZ2xBZy4LNTRKGfUK683LrDCitMVBezjEAVrkQdUT1I4C7LXBZQ==", + "requires": { + "tslib": "^2.1.0" + } + }, "ngx-toastr": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.2.2.tgz", - "integrity": "sha512-/Ajr9E0llr51Zij8WgnxQpe7a5JK+k1n07/uWJcQ112OBH0GCktHi8M8QfGvw5Ih67hG8iowrT+aHXHS49gZcQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.3.0.tgz", + "integrity": "sha512-d8j/sOr60w5U7rGlcKQ0Ff4u+m2NzhqU5ZdJXn7QW3aR3Zf/rY7/Fd14BmUindTOWVr2NeTYcQXCjLpir0ldpA==", "requires": { "tslib": "^2.3.0" } @@ -23996,15 +24470,6 @@ "which": "^2.0.2" }, "dependencies": { - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -24017,11 +24482,20 @@ } }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -24031,7 +24505,7 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, "normalize-url": { @@ -24075,6 +24549,18 @@ "validate-npm-package-name": "^3.0.0" } }, + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-pick-manifest": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", @@ -24104,7 +24590,7 @@ "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "requires": { "path-key": "^2.0.0" @@ -24123,9 +24609,9 @@ } }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -24134,13 +24620,13 @@ "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", "dev": true }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true }, "oauth-sign": { @@ -24152,13 +24638,13 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "requires": { "copy-descriptor": "^0.1.0", @@ -24169,7 +24655,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -24178,7 +24664,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -24187,7 +24673,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -24215,7 +24701,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -24223,6 +24709,12 @@ } } }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -24242,28 +24734,16 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "requires": { "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -24276,9 +24756,9 @@ "dev": true }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -24293,7 +24773,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -24331,7 +24811,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true } } @@ -24404,31 +24884,22 @@ } } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, "p-limit": { @@ -24509,20 +24980,6 @@ "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.1.0" - }, - "dependencies": { - "npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - } } }, "parent-module": { @@ -24631,13 +25088,13 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "path-exists": { @@ -24649,19 +25106,19 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "path-parse": { @@ -24673,7 +25130,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -24697,13 +25154,13 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, "picomatch": { @@ -24715,19 +25172,19 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { "pinkie": "^2.0.0" @@ -24743,14 +25200,14 @@ } }, "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "dependencies": { "debug": { @@ -24763,12 +25220,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -24776,7 +25233,7 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true }, "postcss": { @@ -24800,12 +25257,6 @@ "postcss-selector-parser": "^6.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -24844,12 +25295,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -24879,12 +25324,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -24912,13 +25351,7 @@ "postcss": "^7.0.14", "postcss-values-parser": "^2.0.1" }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, + "dependencies": { "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -24948,12 +25381,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -24982,12 +25409,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25007,23 +25428,24 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "requires": { + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -25036,12 +25458,6 @@ "postcss": "^7.0.14" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25070,12 +25486,6 @@ "postcss-values-parser": "^2.0.1" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25110,12 +25520,6 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25161,12 +25565,6 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25197,9 +25595,9 @@ } }, "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, "requires": {} }, @@ -25234,12 +25632,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25268,12 +25660,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25301,12 +25687,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25334,12 +25714,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25367,12 +25741,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25400,12 +25768,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25434,12 +25796,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25478,12 +25834,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25513,12 +25863,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25557,12 +25901,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25590,12 +25928,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25615,22 +25947,22 @@ } }, "postcss-merge-longhand": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", - "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^*" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", - "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -25646,9 +25978,9 @@ } }, "postcss-minify-gradients": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", - "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, "requires": { "colord": "^2.9.1", @@ -25657,20 +25989,20 @@ } }, "postcss-minify-params": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", - "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -25684,9 +26016,9 @@ "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "requires": { "icss-utils": "^5.0.0", @@ -25721,12 +26053,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25762,18 +26088,18 @@ } }, "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -25798,12 +26124,12 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -25827,9 +26153,9 @@ } }, "postcss-ordered-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", - "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, "requires": { "cssnano-utils": "^3.1.0", @@ -25845,12 +26171,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25878,12 +26198,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25912,12 +26226,6 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -25981,12 +26289,6 @@ "postcss-selector-not": "^4.0.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26021,12 +26323,6 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26057,12 +26353,12 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -26084,12 +26380,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26118,12 +26408,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26152,12 +26436,6 @@ "postcss": "^7.0.2" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26177,9 +26455,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -26231,7 +26509,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "process-nextick-args": { "version": "2.0.1", @@ -26242,7 +26520,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "promise-retry": { @@ -26268,13 +26546,13 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "public-encrypt": { @@ -26308,9 +26586,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qjobs": { "version": "1.2.0", @@ -26319,15 +26597,18 @@ "dev": true }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true }, "querystringify": { @@ -26366,13 +26647,13 @@ "dev": true }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -26413,9 +26694,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -26428,7 +26709,7 @@ "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "requires": { "pify": "^2.3.0" @@ -26445,9 +26726,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -26476,9 +26757,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -26491,9 +26772,9 @@ "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -26516,39 +26797,34 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -26557,7 +26833,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } @@ -26565,7 +26841,7 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "repeat-element": { @@ -26577,7 +26853,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true }, "request": { @@ -26625,7 +26901,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { @@ -26642,7 +26918,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { @@ -26658,7 +26934,7 @@ "resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, "requires": { "resolve-from": "^3.0.0" @@ -26667,7 +26943,7 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true } } @@ -26681,7 +26957,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "dev": true }, "resolve-url-loader": { @@ -26697,12 +26973,6 @@ "source-map": "0.6.1" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -26740,7 +27010,7 @@ "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true }, "reusify": { @@ -26811,7 +27081,7 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "requires": { "ret": "~0.1.10" @@ -26888,7 +27158,7 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "selfsigned": { @@ -26907,27 +27177,44 @@ "dev": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -26942,7 +27229,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -26958,6 +27245,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, @@ -26973,7 +27266,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -26994,10 +27287,16 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -27009,13 +27308,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -27027,21 +27326,21 @@ } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "set-value": { @@ -27059,7 +27358,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -27068,7 +27367,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true } } @@ -27100,7 +27399,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -27109,9 +27408,20 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -27158,7 +27468,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -27167,7 +27477,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -27176,7 +27486,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -27185,7 +27495,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -27196,7 +27506,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -27205,7 +27515,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -27227,7 +27537,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true }, "kind-of": { @@ -27239,13 +27549,13 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true }, "source-map-resolve": { @@ -27277,7 +27587,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -27297,7 +27607,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -27306,23 +27616,23 @@ } }, "socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -27331,15 +27641,18 @@ } }, "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "requires": { + "ws": "~8.11.0" + } }, "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", @@ -27358,13 +27671,13 @@ } }, "sockjs-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", - "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "requires": { "debug": "^3.2.7", - "eventsource": "^1.1.0", + "eventsource": "^2.0.2", "faye-websocket": "^0.11.4", "inherits": "^2.0.4", "url-parse": "^1.5.10" @@ -27382,24 +27695,35 @@ } }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "source-list-map": { @@ -27553,7 +27877,7 @@ "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "requires": { "define-property": "^0.2.5", @@ -27563,7 +27887,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -27572,7 +27896,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -27581,7 +27905,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -27592,7 +27916,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -27601,7 +27925,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -27631,7 +27955,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true }, "stream-browserify": { @@ -27644,20 +27968,20 @@ } }, "streamroller": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", - "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "requires": { - "date-format": "^4.0.5", - "debug": "^4.3.3", - "fs-extra": "^10.0.1" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -27696,7 +28020,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true }, "style-loader": { @@ -27735,9 +28059,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -27748,12 +28072,12 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -27785,7 +28109,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "semver": { @@ -27829,6 +28153,14 @@ "csso": "^4.2.0", "picocolors": "^1.0.0", "stable": "^0.1.8" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } } }, "symbol-observable": { @@ -27844,17 +28176,31 @@ "dev": true }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "terser": { @@ -27916,9 +28262,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -27937,13 +28283,13 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "thunky": { @@ -27952,12 +28298,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -27970,13 +28310,13 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -27985,7 +28325,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -28037,14 +28377,14 @@ "dev": true }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -28053,7 +28393,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-fest": { @@ -28079,9 +28419,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -28101,15 +28441,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, "union-value": { @@ -28127,7 +28467,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true } } @@ -28135,7 +28475,7 @@ "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true }, "unique-filename": { @@ -28157,21 +28497,21 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "requires": { "has-value": "^0.3.1", @@ -28181,7 +28521,7 @@ "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "requires": { "get-value": "^2.0.3", @@ -28192,7 +28532,7 @@ "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "requires": { "isarray": "1.0.0" @@ -28203,7 +28543,7 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true } } @@ -28214,6 +28554,24 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -28225,13 +28583,13 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "dev": true }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dev": true, "requires": { "punycode": "1.3.2", @@ -28241,7 +28599,7 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true } } @@ -28265,12 +28623,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, "uuid": { @@ -28282,7 +28640,7 @@ "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" @@ -28291,13 +28649,13 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -28308,13 +28666,13 @@ "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -28333,7 +28691,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" @@ -28402,9 +28760,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -28470,9 +28828,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -28545,7 +28903,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "anymatch": { @@ -28561,7 +28919,7 @@ "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" @@ -28596,7 +28954,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -28661,7 +29019,7 @@ "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -28673,7 +29031,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -28704,7 +29062,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -28714,7 +29072,7 @@ "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, "requires": { "is-extglob": "^2.1.0" @@ -28722,10 +29080,16 @@ } } }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "requires": { "binary-extensions": "^1.0.0" @@ -28734,19 +29098,19 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -28755,7 +29119,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -28801,12 +29165,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-limit": { @@ -28830,13 +29194,13 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -28922,7 +29286,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -28940,7 +29304,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -29121,9 +29485,9 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "wide-align": { @@ -29136,9 +29500,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wrap-ansi": { @@ -29181,13 +29545,13 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} }, @@ -29198,9 +29562,9 @@ "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yaml": { @@ -29210,24 +29574,24 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yocto-queue": { @@ -29237,9 +29601,9 @@ "dev": true }, "zone.js": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", - "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", + "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", "requires": { "tslib": "^2.3.0" } diff --git a/frontend/package.json b/frontend/package.json index 584ac04ad0..b5bce1594b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,6 +28,7 @@ "ngx-colors": "3.0.5", "ngx-file-drop": "^12.0.0", "ngx-toastr": "^14.1.0", + "ngx-mask": "^12.0.0", "process": "^0.11.10", "rxjs": "~6.6.0", "stream-browserify": "^3.0.0", @@ -65,5 +66,6 @@ "test": "ng test", "watch": "ng build --watch --configuration development --output-path ../www-data" }, - "version": "2.12.2" + "version": "2.13.0-prerelease", + "stableVersion": "2.12.0" } diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index dacc7780ef..ef14402124 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -140,7 +140,8 @@ export class ServicesStatusGuard implements CanActivate { } canActivate() { - return this.status.IsServicesReady(); + return true; + // return this.status.IsServicesReady(); } } diff --git a/frontend/src/app/app.component.scss b/frontend/src/app/app.component.scss index dc759b5c38..2c8d6f0119 100644 --- a/frontend/src/app/app.component.scss +++ b/frontend/src/app/app.component.scss @@ -189,7 +189,7 @@ body { @media (max-width: 810px) { .app { - /* fallback */ + width: 100%; height: 100vh; /* apply the --vh variable as the height */ height: calc(var(--vh, 1vh) * 100); diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index ac124663f3..7b4358bb34 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -38,6 +38,7 @@ import { AnalyticsService } from './services/analytics.service'; import { ModulesService } from './services/modules.service'; import { TagsService } from './services/tag.service'; import { MapService } from './services/map.service'; +import { WizardService } from './modules/policy-engine/services/wizard.service'; //Views import { UserProfileComponent } from './views/user-profile/user-profile.component'; import { LoginComponent } from './views/login/login.component'; @@ -137,6 +138,7 @@ import { ThemeService } from './services/theme.service'; MapService, TagsService, ThemeService, + WizardService, { provide: HTTP_INTERCEPTORS, useClass: HandleErrorsService, diff --git a/frontend/src/app/components/retire-token-dialog/retire-token-dialog.component.css b/frontend/src/app/components/retire-token-dialog/retire-token-dialog.component.css index 0803f7d37d..34f1b23888 100644 --- a/frontend/src/app/components/retire-token-dialog/retire-token-dialog.component.css +++ b/frontend/src/app/components/retire-token-dialog/retire-token-dialog.component.css @@ -146,9 +146,13 @@ display: none !important; } + .g-dialog-content { + height: calc(100% - 87px); + } + .g-dialog-body { width: 90%; - max-height: 48vh; + max-height: calc(100% - 90px); margin: 0 auto !important; padding: 0; } @@ -197,8 +201,6 @@ padding: 20px 0; position: fixed; bottom: 0; - left: 50%; - transform: translateX(-50%); } .lack-input { diff --git a/frontend/src/app/modules/analytics/compare-policy/compare-policy.component.ts b/frontend/src/app/modules/analytics/compare-policy/compare-policy.component.ts index d370144a32..382064f0d2 100644 --- a/frontend/src/app/modules/analytics/compare-policy/compare-policy.component.ts +++ b/frontend/src/app/modules/analytics/compare-policy/compare-policy.component.ts @@ -48,6 +48,7 @@ export class ComparePolicyComponent implements OnInit { "aggregateDocumentBlock": "calendar_month", "reassigningBlock": "content_copy", "revokeBlock": "restart_alt", + "revocationBlock": "restart_alt", "setRelationshipsBlock": "settings", "splitBlock": "content_cut", "filtersAddon": "filter_alt", diff --git a/frontend/src/app/modules/common/common-components.module.ts b/frontend/src/app/modules/common/common-components.module.ts index b27b5c47e9..55c15dac26 100644 --- a/frontend/src/app/modules/common/common-components.module.ts +++ b/frontend/src/app/modules/common/common-components.module.ts @@ -17,6 +17,10 @@ import { NgxFileDropModule } from 'ngx-file-drop'; import { FileExplorer } from './file-explorer/file-explorer.component'; import { NgxColorsModule } from 'ngx-colors'; import { ConfirmDialog } from './confirm-dialog/confirm-dialog.component'; +import { SelectorDialogComponent } from './selector-dialog/selector-dialog.component'; +import { StepTreeComponent } from './step-tree/step-tree.component'; +import { SeparateStepperComponent } from './separate-stepper/separate-stepper.component'; +import { NgxMaskModule } from 'ngx-mask'; @NgModule({ declarations: [ @@ -31,7 +35,10 @@ import { ConfirmDialog } from './confirm-dialog/confirm-dialog.component'; TokenConfigurationComponent, TokenDialog, FileExplorer, - ConfirmDialog + ConfirmDialog, + SelectorDialogComponent, + StepTreeComponent, + SeparateStepperComponent ], imports: [ CommonModule, @@ -39,7 +46,8 @@ import { ConfirmDialog } from './confirm-dialog/confirm-dialog.component'; MaterialModule, NgxMatDatetimePickerModule, NgxFileDropModule, - NgxColorsModule + NgxColorsModule, + NgxMaskModule.forRoot() ], exports: [ DatetimePicker, @@ -54,7 +62,10 @@ import { ConfirmDialog } from './confirm-dialog/confirm-dialog.component'; TokenDialog, FileExplorer, ConfirmDialog, - NgxColorsModule + NgxColorsModule, + SelectorDialogComponent, + SeparateStepperComponent, + NgxMaskModule ] }) export class CommonComponentsModule { } diff --git a/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.css b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.css new file mode 100644 index 0000000000..f341db14eb --- /dev/null +++ b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.css @@ -0,0 +1,4 @@ +.options-form-field { + margin-top: 10px; + width: 100%; +} \ No newline at end of file diff --git a/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.html b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.html new file mode 100644 index 0000000000..93f4672992 --- /dev/null +++ b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.html @@ -0,0 +1,17 @@ +

{{title}}

+
+
{{description}}
+ + {{label}} + + {{option.name}} + + +
+
+ + +
\ No newline at end of file diff --git a/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.ts b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.ts new file mode 100644 index 0000000000..06a039bcee --- /dev/null +++ b/frontend/src/app/modules/common/selector-dialog/selector-dialog.component.ts @@ -0,0 +1,43 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; + +export interface SelectorDialogOptions { + name: string; + value: string; +} + +@Component({ + selector: 'app-selector-dialog', + templateUrl: './selector-dialog.component.html', + styleUrls: ['./selector-dialog.component.css'], +}) +export class SelectorDialogComponent implements OnInit { + title!: string; + description!: string; + label: string = 'Choose an option'; + multiple!: boolean; + options!: SelectorDialogOptions[]; + + result: any; + + constructor( + @Inject(MAT_DIALOG_DATA) + public data: { + title: string; + description: string; + label?: string; + options: SelectorDialogOptions[]; + multiple?: boolean; + } + ) { + this.title = data?.title; + this.description = data?.description; + this.multiple = !!data?.multiple; + this.options = data?.options || []; + if (data?.label) { + this.label = data?.label; + } + } + + ngOnInit(): void {} +} diff --git a/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.css b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.css new file mode 100644 index 0000000000..a669ec0666 --- /dev/null +++ b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.css @@ -0,0 +1,96 @@ +.stepper-container { + display: flex; + position: relative; + height: 100%; + max-height: 100%; +} + +.stepper-steps-container { + min-width: 150px; + overflow-y: hidden; + position: relative; + padding-right: 10px; +} + +.stepper-steps-container::after { + content: ''; + background-color: lightgray; + position: absolute; + right: 0; + top: 0; + width: 1px; + padding: 0 4px; + height: 100%; + border-radius: 10px; + cursor: ew-resize; + background-clip: content-box; +} + +.stepper-steps { + height: 100%; + overflow-y: scroll; + padding-right: 20px; +} + +.stepper-view-container { + flex: 1; + overflow: auto; + padding: 10px 30px; + display: flex; + align-items: center; + flex-direction: column; + +} + +.stepper-view-content { + width: 100%; + overflow-y: scroll; + position: relative; + box-sizing: border-box; + padding-right: 5px; +} + +.stepper-view-header { + z-index: 2; + background-color: white; + top: 0; + position: sticky; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + width: 100%; + padding-bottom: 10px; + background-origin: content-box; +} + + +.title-icon { + color: #3f51b5; + width: 35px; + height: 35px; + font-size: 35px; +} + +.title-label { + font-size: 24px; + text-align: center; +} + +.step-action-buttons { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: auto; + padding-top: 15px; + gap: 30px; + width: 100%; +} + +.step-action-buttons button { + flex: 1; +} + +.step-action-prev-btn { + border: 1px solid rgba(0, 0, 0, .12); +} \ No newline at end of file diff --git a/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.html b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.html new file mode 100644 index 0000000000..ea4e397dc6 --- /dev/null +++ b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.html @@ -0,0 +1,22 @@ +
+
+
+ +
+
+
+
+ {{currentNode.icon}} +
{{currentNode.name}}
+
+
+ +
+
+ + +
+
+
diff --git a/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.ts b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.ts new file mode 100644 index 0000000000..27e9e2fa9e --- /dev/null +++ b/frontend/src/app/modules/common/separate-stepper/separate-stepper.component.ts @@ -0,0 +1,138 @@ +import { + Component, + ElementRef, + EventEmitter, + HostListener, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import { StepTreeComponent } from '../step-tree/step-tree.component'; + +@Component({ + selector: 'app-separate-stepper', + templateUrl: './separate-stepper.component.html', + styleUrls: ['./separate-stepper.component.css'], +}) +export class SeparateStepperComponent implements OnInit { + mousePosition!: any; + resizeFunc!: any; + hasPrevStep: boolean = false; + hasNextStep: boolean = false; + + @ViewChild(StepTreeComponent) matTree!: StepTreeComponent; + @ViewChild('stepperContainer', { read: ElementRef }) + stepperContainer!: ElementRef; + + @Input('treeData') treeData!: any; + @Input('currentNode') currentNode: any; + + @Output('currentNodeChange') currentNodeChange: EventEmitter = + new EventEmitter(); + + constructor() {} + + ngOnInit(): void {} + + ngOnChanges(): void { + this.setHasPrevNextButtonsVisible(); + } + + setHasPrevNextButtonsVisible() { + if (this.currentNode) { + this.hasPrevStep = !!this.getPrevNode(); + this.hasNextStep = !!this.getNextNode(); + } + } + + onNextClick() { + const nextNode = this.getNextNode(); + if (nextNode) { + this.currentNode = nextNode; + this.hasNextStep = !!this.getNextNode(); + this.currentNodeChange.emit(this.currentNode); + } + } + + getNextNode() { + if (this.currentNode.children && this.currentNode.children[0]) { + return this.currentNode.children[0]; + } else { + return this.findNextNode(this.currentNode); + } + } + + findNextNode(node: any): any { + if (!node) { + return; + } + const nextNode = + node.parent?.children && + node.parent.children[node.parent.children.indexOf(node) + 1]; + return nextNode || this.findNextNode(node?.parent); + } + + onPrevClick() { + const prevNode = this.getPrevNode(); + if (prevNode) { + this.currentNode = prevNode; + this.hasPrevStep = !!this.getPrevNode(); + this.currentNodeChange.emit(this.currentNode); + } + } + + getPrevNode() { + const prevNode = + this.currentNode?.parent?.children && + this.currentNode.parent.children[ + this.currentNode.parent.children.indexOf(this.currentNode) - 1 + ]; + if (prevNode) { + return this.findPrevNode(prevNode); + } else if (this.currentNode?.parent !== this.treeData) { + return this.currentNode.parent; + } + } + + findPrevNode(node: any): any { + return ( + (node?.children && + this.findPrevNode(node.children[node.children.length - 1])) || + node + ); + } + + refreshTree() { + this.matTree.refreshTree(); + this.setHasPrevNextButtonsVisible(); + } + + onSelectNode(node: any) { + this.currentNode = node; + this.currentNodeChange.emit(node); + } + + resize(e: any, target: any) { + const dx = this.mousePosition - e.x; + this.mousePosition = e.x; + target.style.width = + parseInt(getComputedStyle(target).width) - dx + 'px'; + } + + onStartResizeDivider(e: any) { + if (e.offsetX < e.currentTarget.offsetWidth - 9) { + return; + } + this.stepperContainer.nativeElement.style.userSelect = 'none'; + this.mousePosition = e.x; + this.resizeFunc = (ev: any) => this.resize.apply(this, [ev, e.target]); + document.addEventListener('mousemove', this.resizeFunc, false); + } + + @HostListener('document:mouseup', ['$event']) + onEndResize(e: any) { + this.stepperContainer.nativeElement.style.userSelect = ''; + document.removeEventListener('mousemove', this.resizeFunc, false); + } +} diff --git a/frontend/src/app/modules/common/step-tree/step-tree.component.css b/frontend/src/app/modules/common/step-tree/step-tree.component.css new file mode 100644 index 0000000000..4126d90a5c --- /dev/null +++ b/frontend/src/app/modules/common/step-tree/step-tree.component.css @@ -0,0 +1,41 @@ +.tree-invisible { + display: none; +} + +.tree .mat-nested-tree-node div[role=group] { + padding-left: 40px; +} + +.node::after { + content: ''; + display: block; + width: 0; + height: 3px; + background: #3f51b5; + transition: width .3s; + position: absolute; +} + +.current-node::after { + width: 100%; +} + +.mat-tree-node.mat-tree-node-no-children { + padding-left: 40px; +} + +.node { + white-space: nowrap; + height: 100%; + position: relative; + cursor: pointer; +} + +.node-id { + margin-right: 5px; + font-weight: bold; +} + +.current-node .node-id { + color: #3f51b5; +} \ No newline at end of file diff --git a/frontend/src/app/modules/common/step-tree/step-tree.component.html b/frontend/src/app/modules/common/step-tree/step-tree.component.html new file mode 100644 index 0000000000..2bc394ebaa --- /dev/null +++ b/frontend/src/app/modules/common/step-tree/step-tree.component.html @@ -0,0 +1,25 @@ + + + + + +
+ + +
+
+ +
+
+
+ + +
{{node.id}}{{node.name}}
+ +
\ No newline at end of file diff --git a/frontend/src/app/modules/common/step-tree/step-tree.component.ts b/frontend/src/app/modules/common/step-tree/step-tree.component.ts new file mode 100644 index 0000000000..07799f7d35 --- /dev/null +++ b/frontend/src/app/modules/common/step-tree/step-tree.component.ts @@ -0,0 +1,68 @@ +import { NestedTreeControl } from '@angular/cdk/tree'; +import { + Component, + EventEmitter, + Input, + Output, + SimpleChanges, +} from '@angular/core'; +import { MatTreeNestedDataSource } from '@angular/material/tree'; + +interface TreeNode { + name: string; + children?: TreeNode[]; +} + +@Component({ + selector: 'app-step-tree', + templateUrl: './step-tree.component.html', + styleUrls: ['./step-tree.component.css'], +}) +export class StepTreeComponent { + treeControl = new NestedTreeControl((node) => node.children); + dataSource = new MatTreeNestedDataSource(); + + @Input('treeData') treeData!: any; + @Input('currentNode') currentNode!: any; + + @Output('currentNodeChange') currentNodeChange: EventEmitter = + new EventEmitter(); + + constructor() {} + + ngOnInit() { + this.dataSource.data = this.treeData; + this.treeControl.dataNodes = this.treeData; + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.currentNode.isFirstChange()) { + this.expandAllParents(changes.currentNode.currentValue); + } else if (changes.currentNode.currentValue?.parent) { + this.treeControl.expand(changes.currentNode.currentValue.parent); + } + } + + expandAllParents(node: any) { + if (node.parent) { + this.treeControl.expand(node.parent); + this.expandAllParents(node.parent); + } + } + + hasChild(_: number, node: TreeNode) { + return !!node.children && node.children.length > 0; + } + + onNodeClick(node: any) { + this.currentNodeChange.emit(node); + } + + refreshTree() { + const data = this.dataSource.data; + this.dataSource.data = []; + this.dataSource.data = data; + this.treeControl.dataNodes = data; + this.treeControl.expand(this.currentNode); + } +} diff --git a/frontend/src/app/modules/common/token-dialog/token-dialog.component.css b/frontend/src/app/modules/common/token-dialog/token-dialog.component.css index 0e9cfdd055..fa8e388bac 100644 --- a/frontend/src/app/modules/common/token-dialog/token-dialog.component.css +++ b/frontend/src/app/modules/common/token-dialog/token-dialog.component.css @@ -43,10 +43,14 @@ margin-right: 0 !important; } + .g-dialog-content { + height: calc(100% - 87px); + } + .g-dialog-body { width: 90%; margin: 0 auto !important; - max-height: calc(var(--vh, 1vh) * 100 - var(--header-height) - 90px - 107px - 55px); + max-height: calc(100% - 90px); padding: 0; } diff --git a/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.css b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.css new file mode 100644 index 0000000000..cffc24fec6 --- /dev/null +++ b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.css @@ -0,0 +1,204 @@ +.mat-dialog-content { + overflow: visible; +} + +.mat-dialog-actions { + padding: 15px 0; +} + +.description { + margin-bottom: 20px; +} + +.g-dialog-actions-btn { + min-width: 210px !important; +} + +.g-dialog-body { + height: calc(100vh - 300px); +} + +form { + display: flex; + flex-direction: column; + overflow: visible; + width: 100%; +} + +.full-width { + width: 100%; +} + + +.policy-role-card { + height: 35px; + border: 3px solid #3f51b5; + padding: 0px 20px; + border-radius: 10px; + display: flex; + align-items: center; + gap: 10px; +} + +.delete-icon { + color: red; + cursor: pointer; +} + +.delete-policy-role-icon { + display: none; + position: absolute; + top: 8px; + left: 50%; + transform: translate(-12px, 0px); +} + +.policy-roles-container { + display: flex; + align-items: center; + margin-bottom: 20px; + gap: 30px; + overflow-x: scroll; + padding: 20px; +} + +.policy-role-card-container { + position: relative; +} + +.policy-role-card-container[disabled="false"]:hover .delete-policy-role-icon { + display: block; +} + +.policy-role-card-container[disabled="true"] .policy-role-card { + background-color: #e1e1e1; +} + +.policy-role-card-container[disabled="false"]:hover { + cursor: pointer; +} + +.policy-role-card-container[disabled="false"]:hover .policy-role-card { + opacity: 0.5; +} + +.policy-roles-add-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.info-btn { + transform: scale(.5); + font-size: 28px; +} + +.info-btn-container { + display: flex; + align-items: center; +} + +.help-img { + width: 500px; + margin: 10px; +} + +.grid-columns-list { + border: solid 1px #ccc; + min-height: 60px; + display: inline-flex; + flex-direction: row; + background: white; + border-radius: 4px; + overflow: visible; + margin: 10px 0; + box-sizing: border-box; + min-width: 100%; +} + +.grid-column { + padding: 20px 10px; + border-right: solid 1px #ccc; + color: rgba(0, 0, 0, 0.87); + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + cursor: move; + background: white; + font-size: 14px; + flex-grow: 1; + flex-basis: 0; + white-space: nowrap; +} + +.cdk-drag-preview { + box-sizing: border-box; + border-radius: 4px; + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), + 0 8px 10px 1px rgba(0, 0, 0, 0.14), + 0 3px 14px 2px rgba(0, 0, 0, 0.12); +} + +.cdk-drag-placeholder { + opacity: 0; +} + +.cdk-drag-animating { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +.grid-column:last-child { + border: none; +} + +.grid-columns-list.cdk-drop-list-dragging .grid-column:not(.cdk-drag-placeholder) { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +.grid-columns-title { + text-align: center; +} + +.grid-columns-container { + overflow-x: scroll; + margin: 10px 0; +} + +.grid-column-container { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + gap: 5px; +} + +.grid-column-disabled { + background: #e1e1e1; +} + +.grid-column-add-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.form-field-info { + width: 100%; + display: flex; +} + +.form-field-info .info-btn { + transform: translateY(8px) scale(.5); +} + +.slide-toggle { + margin: 8px; +} + +.info-btn-container .slide-toggle { + margin: 0 8px; +} \ No newline at end of file diff --git a/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.html b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.html new file mode 100644 index 0000000000..e5e1240c4b --- /dev/null +++ b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.html @@ -0,0 +1,249 @@ +
+
+
+
+ close +
+
+
+ Policy Wizard +
+
+
+ Create +
+
+
+
+ +
+
+ + +
+ + * NAME: + + + + * TAG: + + + + TOPIC DESCRIPTION: + + + + DESCRIPTION: + + +
+
+ + +
+
+
+ person + {{role}} +
+ delete +
+
+
+ + * NAME: + + + +
+
+ + + + + Which schemas will be used in policy? + + + {{schema.name}}{{schema.topicId ? ' (' + + schema.topicId + ')' : ''}} + + + + + + +
+ + Which users are able to view? + + {{role}} + + +
+ + Produced schema: + + + {{schema.name}} + + + + + + +
+ + Relationship schema: + + + {{schema.name}} + + +
+ + Initial for roles: + + {{role}} + + + + + + +
+ + + + Minting tokens + +
+
+ + Token: + + + {{token.tokenName}} + + + + Field: + + {{schemaField.description}} + + +
+
+ + +
+ + + + + + +

Grid Columns

+
+
+
+
+
{{column.title}}
+ delete +
+ +
+
Document
+
Operation
+
Create {{dependencySchema}} +
+
+
+
+ + * Column name: + + + + * Field: + + {{schemaField.description}} + + + +
+
+
+
+ + + + + Which users are able to view? + + {{role}} + + + + + +
+ + Minting Schema: + + {{schema.name}} + + + + View only own VPs? + +
+
+ + +
+ + {{title}} + + + + + +
+
\ No newline at end of file diff --git a/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.ts b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.ts new file mode 100644 index 0000000000..1a79ccc02b --- /dev/null +++ b/frontend/src/app/modules/policy-engine/helpers/policy-wizard-dialog/policy-wizard-dialog.component.ts @@ -0,0 +1,696 @@ +import { + ChangeDetectorRef, + Component, + Inject, + OnInit, + TemplateRef, + ViewChild, +} from '@angular/core'; +import { + Validators, + FormBuilder, + FormControl, + FormGroup, + FormArray, + AbstractControl, +} from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + IWizardConfig, + Schema, + SchemaField, + Token, +} from '@guardian/interfaces'; +import { Subject } from 'rxjs'; +import { RetireTokenDialogComponent } from 'src/app/components/retire-token-dialog/retire-token-dialog.component'; +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { takeUntil } from 'rxjs/operators'; +import { SeparateStepperComponent } from 'src/app/modules/common/separate-stepper/separate-stepper.component'; + +@Component({ + selector: 'app-policy-wizard-dialog', + templateUrl: './policy-wizard-dialog.component.html', + styleUrls: ['./policy-wizard-dialog.component.css'], +}) +export class PolicyWizardDialogComponent implements OnInit { + @ViewChild(SeparateStepperComponent) matTree!: SeparateStepperComponent; + @ViewChild('policyDescriptionForm', { read: TemplateRef }) + policyDescriptionFormTemp: any; + @ViewChild('policyRoles', { read: TemplateRef }) policyRoles: any; + @ViewChild('policySchemas', { read: TemplateRef }) policySchemas: any; + @ViewChild('schemaConfig', { read: TemplateRef }) schemaConfig: any; + @ViewChild('schemaRoleConfig', { read: TemplateRef }) schemaRoleConfig: any; + @ViewChild('trustChainConfig', { read: TemplateRef }) trustChainConfig: any; + @ViewChild('trustChainRoleConfig', { read: TemplateRef }) + trustChainRoleConfig: any; + + tokens!: Token[]; + schemas!: Schema[]; + policies!: any[]; + groupedSchemas: { + name: string; + schemas: Schema[]; + }[] = []; + selectedSchemas: Schema[] = []; + mintedSchemas: Schema[] = []; + selectedTrustChainRoles: string[] = []; + + policyForm = this.fb.group({ + name: ['', Validators.required], + description: [''], + topicDescription: [''], + policyTag: [`Tag_${Date.now()}`, Validators.required], + }); + policyRolesForm = this.fb.control(['OWNER']); + policySchemasForm = this.fb.array([]); + trustChainForm = this.fb.array([]); + + dataForm: FormGroup = this.fb.group({ + policy: this.policyForm, + roles: this.policyRolesForm, + schemas: this.policySchemasForm, + trustChain: this.trustChainForm, + }); + + treeData: any; + currentNode: any; + + destroy$: Subject = new Subject(); + + preset: any; + + constructor( + public dialogRef: MatDialogRef, + private fb: FormBuilder, + private cdRef: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) + public data: { + schemas: Schema[]; + [key: string]: any; + } + ) { + this.schemas = data?.schemas || []; + this.policies = data?.policies || []; + this.groupedSchemas = this.mapGroupedSchemas( + this.groupSchemasByTopics(this.schemas), + this.policies, + data?.policy + ); + if (data?.policy) { + this.policyForm.patchValue({ + name: data?.policy.name, + description: data?.policy.description, + policyTag: data?.policy.policyTag, + topicDescription: data?.policy.topicDescription, + }); + this.policyForm.get('policyTag')?.disable(); + } + this.tokens = data?.tokens || []; + this.preset = data?.state || []; + } + + private mapGroupedSchemas( + groupedSchemasByTopic: any, + policies: any[], + policy?: any + ) { + const mappedSchemas = policy + ? [ + { + name: + policy.name + + (policy.version ? ' (' + policy.version + ')' : ''), + schemas: groupedSchemasByTopic[policy?.topicId], + }, + { + name: 'Draft schemas', + schemas: groupedSchemasByTopic['draft'], + }, + ] + : [ + { + name: 'Draft schemas', + schemas: groupedSchemasByTopic['draft'], + }, + ]; + for (const group of Object.entries(groupedSchemasByTopic)) { + if ( + group[0] && + group[0] !== 'draft' && + group[0] !== policy?.topicId + ) { + const policy = policies.find( + (policy) => policy.topicId === group[0] + ); + if (!policy) { + continue; + } + mappedSchemas.push({ + name: + policy.name + + (policy.version ? ' (' + policy.version + ')' : ''), + schemas: group[1] as Schema[], + }); + } + } + return mappedSchemas; + } + + private groupSchemasByTopics(schemas: Schema[]) { + return this.schemas.reduce((group: any, schema: any) => { + const { topicId } = schema; + group[topicId] = group[topicId] ?? []; + group[topicId].push(schema); + return group; + }, {}); + } + + ngOnInit() {} + + ngAfterViewInit() { + const schemasNode = { + id: '3', + name: 'Policy Schemas', + template: this.policySchemas, + icon: 'description', + children: [], + }; + const trustChainNode = { + id: '4', + name: 'Trust Chain', + control: this.trustChainForm, + template: this.trustChainConfig, + icon: 'link', + children: [], + }; + this.treeData = { + name: 'Wizard Configuration', + children: [ + { + id: '1', + name: 'Policy Description', + template: this.policyDescriptionFormTemp, + control: this.policyForm, + icon: 'settings', + children: [], + }, + { + id: '2', + name: 'Policy Roles', + control: this.policyRolesForm, + template: this.policyRoles, + icon: 'groups', + children: [], + }, + schemasNode, + trustChainNode, + ], + }; + this.setParents(this.treeData); + this.currentNode = this.treeData.children[0]; + if (this.preset) { + this.loadData( + this.preset.data, + schemasNode, + trustChainNode, + this.preset.currentNode + ); + } + this.cdRef.detectChanges(); + } + + loadData( + data: IWizardConfig, + schemasNode: any, + trustChainNode: any, + currentNodeId?: string + ) { + if (!data) { + return; + } + if (data.schemas) { + const selectedSchemasIris = data.schemas.map((item) => item.iri); + this.selectedSchemas = this.schemas.filter((item) => + selectedSchemasIris.includes(item.iri as any) + ); + for (const schemaConfig of data.schemas) { + const schema: any = this.schemas.find( + (item) => item.iri === schemaConfig.iri + ); + const schemaNode: any = this.onSelectedSchemaChange( + schema, + schemasNode, + schemaConfig.rolesConfig.map((item: any) => item.role) + ); + for (const roleConfig of schemaConfig.rolesConfig) { + const schemaRoleConfigControl = schemaNode.control.get( + 'rolesConfig' + ) as FormArray; + const initialRolesForControl: any = + schemaNode.control.get('initialRolesFor'); + + const isApproveEnableControl: any = + schemaNode.control.get('isApproveEnable'); + const dependencySchemaControl: any = schemaNode.control.get( + 'dependencySchemaIri' + ); + this.onSchemaRoleConfigChange( + roleConfig.role, + schema.fields, + schemaRoleConfigControl, + initialRolesForControl, + isApproveEnableControl, + dependencySchemaControl, + schemaNode + ); + } + } + } + if (data.trustChain) { + this.selectedTrustChainRoles = data.trustChain.map( + (item) => item.role + ); + for (const trustChainConfig of data.trustChain) { + this.onSelectedTrustChainRoleChange( + trustChainConfig.role, + trustChainNode + ); + } + } + this.dataForm.patchValue({ + roles: data.roles, + schemas: data.schemas, + trustChain: data.trustChain, + }); + const currentNode = this.findCurrentNode( + this.treeData, + currentNodeId?.split('.') + ); + if (currentNode && currentNode !== this.treeData) { + this.currentNode = currentNode; + } + } + + findCurrentNode(node: any, indexes: string[] = []) { + if (!Array.isArray(indexes)) { + return node; + } + let result = node; + for (const index of indexes) { + result = result.children[+index - 1]; + } + return result; + } + + setParents(root: any) { + root.children?.forEach((child: any) => { + child.parent = root; + this.setParents(child); + }); + } + + onSchemaRolesConfigChange( + schemaConfigControl: FormGroup, + roles: string[], + fields: any[], + options: any + ) { + const schemaRoleConfigControl = schemaConfigControl.get( + 'rolesConfig' + ) as FormArray; + const deletedRoles = options.displayedInRoles.filter( + (displayedRole: any) => !roles.includes(displayedRole) + ); + this.currentNode.children = + this.currentNode.children.filter( + (roleSchemaNode: any) => + !deletedRoles.find( + (deletedRole: string) => + roleSchemaNode.role === deletedRole + ) + ) || []; + this.deleteControlsFromFormArray( + schemaRoleConfigControl, + schemaRoleConfigControl.controls.filter((control) => + deletedRoles.find( + (deletedRole: string) => control.value?.role === deletedRole + ) + ) + ); + + const addedRoles = roles.filter( + (existingRole: any) => + !options.displayedInRoles.includes(existingRole) + ); + const initialRolesForControl: any = + schemaConfigControl.get('initialRolesFor'); + + const isApproveEnableControl: any = + schemaConfigControl.get('isApproveEnable'); + const dependencySchemaControl: any = schemaConfigControl.get( + 'dependencySchemaIri' + ); + for (const role of addedRoles) { + this.onSchemaRoleConfigChange( + role, + fields, + schemaRoleConfigControl, + initialRolesForControl, + isApproveEnableControl, + dependencySchemaControl, + this.currentNode + ); + } + + options.displayedInRoles = roles; + this.matTree.refreshTree(); + } + + onSchemaRoleConfigChange( + role: string, + fields: SchemaField[], + schemaRoleConfigControl: FormArray, + initialRolesForControl: FormControl, + isApproveEnableControl: FormControl, + dependencySchemaControl: FormControl, + node: any + ) { + const dependencySchema = this.selectedSchemas.find( + (item) => item.iri === dependencySchemaControl?.value + ); + const newNode: any = { + id: `${node.id}.${node.children.length + 1}`, + icon: node.icon, + name: `${role} configuration`, + parent: node, + template: this.schemaRoleConfig, + fields, + initialSchemaFor: initialRolesForControl?.value, + approveEnable: isApproveEnableControl?.value, + dependencySchema: dependencySchema?.name, + role, + }; + const dependencySchemaListener = dependencySchemaControl?.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((iri) => { + newNode.dependencySchema = this.selectedSchemas.find( + (item) => item.iri === iri + )?.name; + }); + const isApproveEnableListener = isApproveEnableControl?.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + newNode.approveEnable = value; + }); + + const initialRolesForListener = initialRolesForControl?.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + newNode.initialSchemaFor = value; + }); + const schemaRoleConfigForm = this.fb.group({ + role: [role], + isApprover: [false], + isCreator: [false], + gridColumns: [[]], + }); + schemaRoleConfigControl.push(schemaRoleConfigForm); + newNode.control = schemaRoleConfigForm; + node.children.push(newNode); + + const rolesSubscription = this.policyRolesForm.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + if (!value.includes(role)) { + node.children.splice(node.children.indexOf(newNode), 1); + this.deleteControlsFromFormArray( + schemaRoleConfigControl, + schemaRoleConfigControl.controls.filter( + (control) => control === schemaRoleConfigForm + ) + ); + node.options.displayedInRoles = + node.options.displayedInRoles.filter( + (displayedRole: string) => + value.includes(displayedRole) + ); + dependencySchemaListener.unsubscribe(); + isApproveEnableListener.unsubscribe(); + initialRolesForListener.unsubscribe(); + this.matTree.refreshTree(); + rolesSubscription.unsubscribe(); + } + }); + + return newNode; + } + + onNoClick(): void { + this.dialogRef.close({ + create: false, + currentNode: this.currentNode.id, + config: this.dataForm.value, + }); + } + + ngOnDestroy() { + this.destroy$.next(true); + this.destroy$.unsubscribe(); + } + + onAddRole(control: FormControl, name: string) { + const selectedRoles: any[] = control?.value; + if (!name || selectedRoles.indexOf(name) >= 0) { + return; + } + selectedRoles?.push(name); + control.updateValueAndValidity(); + } + + onRemoveRole(control: FormControl, name: string) { + const array = control?.value; + if (array.indexOf(name) >= 0 && name !== 'OWNER') { + array?.splice(array.indexOf(name), 1); + control.updateValueAndValidity(); + } + } + + onAddColumn(title: string, field: string, gridColumns: any[]) { + if ( + !title || + !field || + gridColumns.findIndex((item) => item.title === title) >= 0 + ) { + return; + } + gridColumns.push({ + title, + field, + }); + } + + onRemoveColumn(title: string, gridColumns: any[]) { + const array = gridColumns; + if (array.findIndex((item) => item.title === title) >= 0) { + array?.splice( + array.findIndex((item) => item.title === title), + 1 + ); + } + } + + onCreate() { + if (!this.dataForm.valid) { + return; + } + this.dialogRef.close({ + create: true, + currentNode: this.currentNode.id, + config: this.dataForm.value, + }); + } + + onSelectedSchemasChange(value: any) { + const deletedSchemas = this.selectedSchemas.filter( + (schema) => !value.some((item: any) => item.iri === schema.iri) + ); + this.currentNode.children = + this.currentNode.children.filter( + (schema: any) => + !deletedSchemas.some( + (deletedSchema) => + deletedSchema.iri === schema.schema.iri + ) + ) || []; + this.deleteControlsFromFormArray( + this.policySchemasForm, + this.policySchemasForm.controls.filter((control) => + deletedSchemas.find( + (deletedSchema) => deletedSchema.iri === control.value?.iri + ) + ) + ); + this.mintedSchemas = + this.mintedSchemas.filter( + (schema: any) => + !deletedSchemas.some( + (deletedSchema) => deletedSchema.iri === schema.iri + ) + ) || []; + []; + + const addedSchemas = value.filter( + (item: any) => + !this.selectedSchemas.some((schema) => item.iri === schema.iri) + ); + for (const schema of addedSchemas) { + this.onSelectedSchemaChange(schema, this.currentNode); + } + + this.selectedSchemas = value; + this.matTree.refreshTree(); + } + + onSelectedSchemaChange( + schema: Schema, + node: any, + displayedInRoles?: string[] + ) { + const mintControl = this.fb.control(false); + mintControl.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + if (value) { + this.mintedSchemas.push(schema); + } else { + this.mintedSchemas.splice( + this.mintedSchemas.indexOf(schema), + 1 + ); + } + }); + const schemaConfigControl = this.fb.group({ + name: [schema.name], + iri: [schema.iri], + isApproveEnable: [false], + isMintSchema: mintControl, + mintOptions: this.fb.group({ + tokenId: [''], + rule: [''], + }), + dependencySchemaIri: [''], + relationshipsSchemaIri: [''], + initialRolesFor: [[]], + rolesConfig: this.fb.array([]), + }); + this.policySchemasForm.push(schemaConfigControl); + const newNode = { + id: `${node.id}.${node.children.length + 1}`, + icon: node.icon, + name: `${schema.name} configuration`, + children: [], + parent: node, + template: this.schemaConfig, + schema, + mintFields: schema.fields.filter((field) => + ['integer', 'number'].includes(field.type) + ), + control: schemaConfigControl, + options: { + displayedInRoles: displayedInRoles || [], + }, + }; + node.children.push(newNode); + return newNode; + } + + onSelectedTrustChainRolesChange(value: any) { + const deletedRoles = this.selectedTrustChainRoles.filter( + (displayedRole: any) => !value.includes(displayedRole) + ); + this.currentNode.children = + this.currentNode.children.filter( + (roleSchemaNode: any) => + !deletedRoles.includes(roleSchemaNode.role) + ) || []; + this.deleteControlsFromFormArray( + this.trustChainForm, + this.trustChainForm.controls.filter((control) => + deletedRoles.includes(control.value?.role) + ) + ); + + const addedRoles = value.filter( + (existingRole: any) => + !this.selectedTrustChainRoles.includes(existingRole) + ); + for (const role of addedRoles) { + this.onSelectedTrustChainRoleChange(role, this.currentNode); + } + + this.selectedTrustChainRoles = value; + this.matTree.refreshTree(); + } + + onSelectedTrustChainRoleChange(trustChainRole: string, node: any) { + const trustChainRoleConfigControl = this.fb.group({ + role: [trustChainRole], + viewOnlyOwnDocuments: [false], + mintSchemaIri: [''], + }); + this.trustChainForm.push(trustChainRoleConfigControl); + const newNode = { + id: `${node.id}.${node.children.length + 1}`, + icon: node.icon, + name: `${trustChainRole} configuration`, + children: [], + parent: node, + template: this.trustChainRoleConfig, + control: trustChainRoleConfigControl, + role: trustChainRole, + }; + node.children.push(newNode); + + const rolesSubscription = this.policyRolesForm.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + if (!value.includes(trustChainRole)) { + node.children.splice(node.children.indexOf(newNode), 1); + this.deleteControlsFromFormArray( + this.trustChainForm, + trustChainRoleConfigControl + ); + this.selectedTrustChainRoles = + this.selectedTrustChainRoles.filter( + (displayedRole: string) => + value.includes(displayedRole) + ); + this.matTree.refreshTree(); + rolesSubscription.unsubscribe(); + } + }); + } + + deleteControlsFromFormArray( + arrayControl: FormArray, + deleteItems: AbstractControl | AbstractControl[] + ) { + if (Array.isArray(deleteItems)) { + for (const deleteItem of deleteItems) { + arrayControl.removeAt( + arrayControl.controls.indexOf(deleteItem) + ); + } + } else { + arrayControl.removeAt(arrayControl.controls.indexOf(deleteItems)); + } + } + + drop(event: CdkDragDrop, gridColumnsArray: any[]) { + moveItemInArray( + gridColumnsArray, + event.previousIndex, + event.currentIndex + ); + } +} diff --git a/frontend/src/app/modules/policy-engine/policies/policies.component.css b/frontend/src/app/modules/policy-engine/policies/policies.component.css index 0e9a23fbbc..9eade7d206 100644 --- a/frontend/src/app/modules/policy-engine/policies/policies.component.css +++ b/frontend/src/app/modules/policy-engine/policies/policies.component.css @@ -368,4 +368,8 @@ font-size: 30px; left: 10px; top: 7px; -} \ No newline at end of file +} + +.toolbar-btn.wizard-btn { + background-color: #9c27b0; +} diff --git a/frontend/src/app/modules/policy-engine/policies/policies.component.html b/frontend/src/app/modules/policy-engine/policies/policies.component.html index 1e1d815702..2bf691d928 100644 --- a/frontend/src/app/modules/policy-engine/policies/policies.component.html +++ b/frontend/src/app/modules/policy-engine/policies/policies.component.html @@ -16,6 +16,11 @@
+
- \ No newline at end of file + diff --git a/frontend/src/app/modules/policy-engine/policies/policies.component.ts b/frontend/src/app/modules/policy-engine/policies/policies.component.ts index 3346172459..990196b65d 100644 --- a/frontend/src/app/modules/policy-engine/policies/policies.component.ts +++ b/frontend/src/app/modules/policy-engine/policies/policies.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { IUser, SchemaHelper, TagType, UserRole } from '@guardian/interfaces'; +import { IUser, Schema, SchemaHelper, TagType, Token, UserRole } from '@guardian/interfaces'; import { PolicyEngineService } from 'src/app/services/policy-engine.service'; import { ProfileService } from 'src/app/services/profile.service'; import { TokenService } from 'src/app/services/token.service'; @@ -19,13 +19,16 @@ import { ComparePolicyDialog } from '../helpers/compare-policy-dialog/compare-po import { TagsService } from 'src/app/services/tag.service'; import { SetVersionDialog } from '../../schema-engine/set-version-dialog/set-version-dialog.component'; import { forkJoin } from 'rxjs'; +import { SchemaService } from 'src/app/services/schema.service'; +import { WizardMode, WizardService } from 'src/app/modules/policy-engine/services/wizard.service'; enum OperationMode { None, Create, Import, Publish, - Delete + Delete, + WizardCreate } /** @@ -51,6 +54,8 @@ export class PoliciesComponent implements OnInit, OnDestroy { tagEntity = TagType.Policy; tagSchemas: any[] = []; + saveWizardState: boolean = false; + mode: OperationMode = OperationMode.None; taskId: string | undefined = undefined; expectedTaskMessages: number = 0; @@ -108,7 +113,9 @@ export class PoliciesComponent implements OnInit, OnDestroy { private dialog: MatDialog, private taskService: TasksService, private informService: InformService, - private toastr: ToastrService + private toastr: ToastrService, + private schemaService: SchemaService, + private wizardService: WizardService, ) { this.policies = null; this.pageIndex = 0; @@ -240,6 +247,15 @@ export class PoliciesComponent implements OnInit, OnDestroy { this.processPublishResult(taskId); } break; + case OperationMode.WizardCreate: + if (this.taskId) { + const taskId = this.taskId; + this.taskId = undefined; + this.processCreateWizardResult(taskId); + this.mode = OperationMode.None; + this.loadAllPolicy(); + } + break; default: console.log(`Not allowed mode ${this.mode}`); break; @@ -472,11 +488,23 @@ export class PoliciesComponent implements OnInit, OnDestroy { // } } + private processCreateWizardResult(taskId: string): void { + this.taskService.get(taskId).subscribe((task: any) => { + const { result } = task; + if (this.saveWizardState) { + this.wizardService.setWizardPreset(result.policyId, { + data: result.wizardConfig, + }); + this.saveWizardState = false; + } + }); + } + private processPublishResult(taskId: string): void { this.taskService.get(taskId).subscribe((task: any) => { const { result } = task; if (result) { - const { isValid, errors } = result; + const { isValid, errors, policyId } = result; if (!isValid) { let text = []; const blocks = errors.blocks; @@ -499,6 +527,8 @@ export class PoliciesComponent implements OnInit, OnDestroy { } } this.informService.errorMessage(text.join(''), 'The policy is invalid'); + } else { + this.wizardService.removeWizardPreset(policyId) } this.loadAllPolicy(); } @@ -590,4 +620,40 @@ export class PoliciesComponent implements OnInit, OnDestroy { } }); } + + openPolicyWizardDialog() { + this.loading = true; + forkJoin([ + this.tokenService.getTokens(), + this.schemaService.getSchemas(), + this.policyEngineService.all(), + ]).subscribe((result) => { + const tokens = result[0].map((token) => new Token(token)); + const schemas = result[1].map((schema) => new Schema(schema)); + const policies = result[2]; + this.wizardService.openPolicyWizardDialog( + WizardMode.CREATE, + (value) => { + this.saveWizardState = value.saveState; + this.loading = true; + this.wizardService + .createPolicyAsync(value.config) + .subscribe( + (result) => { + const { taskId, expectation } = result; + this.taskId = taskId; + this.expectedTaskMessages = expectation; + this.mode = OperationMode.WizardCreate; + }, + (e) => { + this.loading = false; + } + ); + }, + tokens, + schemas, + policies + ); + }, () => undefined, () => this.loading = false); + } } diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/blocks/documents/document-viewer-config/document-viewer-config.component.html b/frontend/src/app/modules/policy-engine/policy-configuration/blocks/documents/document-viewer-config/document-viewer-config.component.html index aee58a583d..81f450d730 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/blocks/documents/document-viewer-config/document-viewer-config.component.html +++ b/frontend/src/app/modules/policy-engine/policy-configuration/blocks/documents/document-viewer-config/document-viewer-config.component.html @@ -104,10 +104,10 @@ add_link Bind Group - @@ -125,6 +125,7 @@ LINK DIALOG + DOWNLOAD @@ -138,9 +139,9 @@ Bind Block - @@ -181,9 +182,9 @@ Bind Block - @@ -201,14 +202,14 @@ Bind Block - - \ No newline at end of file + diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/common-properties/common-properties.component.html b/frontend/src/app/modules/policy-engine/policy-configuration/common-properties/common-properties.component.html index 628e80d74c..00ca665b31 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/common-properties/common-properties.component.html +++ b/frontend/src/app/modules/policy-engine/policy-configuration/common-properties/common-properties.component.html @@ -63,6 +63,13 @@ {{about.children}} + + + Deprecated + + {{about.deprecated?'Yes':'No'}} + + @@ -169,11 +176,11 @@
diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/common-property/common-property.component.ts b/frontend/src/app/modules/policy-engine/policy-configuration/common-property/common-property.component.ts index 620fd40859..2333d6ad03 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/common-property/common-property.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-configuration/common-property/common-property.component.ts @@ -85,6 +85,8 @@ export class CommonPropertyComponent implements OnInit { } this.childrenBlocks = this.allBlocks.filter(item => item.parent === this.data?.id); this.schemas = moduleVariables?.schemas || []; + } else if(this.property.type === 'Schemas') { + this.schemas = moduleVariables?.schemas || []; } if (this.property.type !== 'Group' && this.property.type !== 'Array') { if (this.property.default && !this.data.hasOwnProperty(this.property.name)) { diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.html b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.html index 021275cfd9..095f05350a 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.html +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.html @@ -26,6 +26,11 @@ Save As +
+ auto_awesome + Wizard +
+
@@ -136,9 +141,9 @@
create_new_folder @@ -799,4 +804,4 @@ palette {{t.name}}
- \ No newline at end of file + diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.scss b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.scss index 13e413921d..2dde011abf 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.scss +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.scss @@ -334,6 +334,10 @@ } } + .wizard-btn { + color: #9c27b0; + } + .top-toolbar-group { padding-right: 21px; min-width: 52px; @@ -1498,4 +1502,4 @@ .policy-configuration { height: calc(100vh - var(--header-height)); } -} \ No newline at end of file +} diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.ts b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.ts index 337054f4a3..f7060a6ce5 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-configuration/policy-configuration.component.ts @@ -23,6 +23,7 @@ import { PolicyBlockModel, PolicyModel, PolicyModuleModel, PolicyStorage, Templa import { Options } from '../../structures/storage/config-options'; import { PolicyTreeComponent } from '../policy-tree/policy-tree.component'; import { ThemeService } from '../../../../services/theme.service'; +import { WizardMode, WizardService } from 'src/app/modules/policy-engine/services/wizard.service'; enum OperationMode { none, @@ -36,7 +37,7 @@ enum OperationMode { @Component({ selector: 'app-policy-configuration', templateUrl: './policy-configuration.component.html', - styleUrls: ['./policy-configuration.component.scss'] + styleUrls: ['./policy-configuration.component.scss'], }) export class PolicyConfigurationComponent implements OnInit { public loading: boolean = true; @@ -178,7 +179,8 @@ export class PolicyConfigurationComponent implements OnInit { private domSanitizer: DomSanitizer, private registeredService: RegisteredService, private modulesService: ModulesService, - private themeService: ThemeService + private themeService: ThemeService, + private wizardService: WizardService, ) { this.options = new Options(); this.policyModel = new PolicyModel(); @@ -477,7 +479,10 @@ export class PolicyConfigurationComponent implements OnInit { this.componentsList.unGrouped = []; const search = this.search ? this.search.toLowerCase() : null; for (const block of all) { - if (search && block.search.indexOf(search) === -1) { + if ( + (search && block.search.indexOf(search) === -1) || + block?.deprecated + ) { continue; } if (block.header === 'UI Components') { @@ -1069,8 +1074,9 @@ export class PolicyConfigurationComponent implements OnInit { break; case OperationMode.publish: const { result } = task; - const { isValid, errors } = result; + const { isValid, errors, policyId } = result; if (isValid) { + this.wizardService.removeWizardPreset(policyId); this.loadData(); } else { this.setErrors(errors); @@ -1172,4 +1178,60 @@ export class PolicyConfigurationComponent implements OnInit { rule.updateLegend(this.openModule); return rule.legend; } + + public openPolicyWizardDialog() { + this.loading = true; + forkJoin([ + this.tokenService.getTokens(), + this.schemaService.getSchemas(), + this.policyEngineService.all(), + ]).subscribe((result) => { + const tokens = result[0].map((token) => new Token(token)); + const schemas = result[1].map((schema) => new Schema(schema)); + const policies = result[2]; + this.wizardService.openPolicyWizardDialog( + WizardMode.EDIT, + (value) => { + if (value.create) { + this.loading = true; + this.wizardService + .getPolicyConfig(this.policyId, value.config) + .subscribe((result) => { + this.loading = false; + this.policyModel.setPolicyInfo( + value.config.policy + ); + const roles = value.config.roles; + const policy = this.policyModel.getJSON(); + policy.policyRoles = roles.filter( + (role: string) => role !== 'OWNER' + ); + policy.config = result.policyConfig; + this.updatePolicyModel(policy); + if (value.saveState) { + this.wizardService.setWizardPreset( + this.policyId, + { + data: result?.wizardConfig, + currentNode: value?.currentNode, + } + ); + } + }); + } else if (value.saveState) { + this.wizardService.setWizardPreset(this.policyId, { + data: value.config, + currentNode: value.currentNode, + }); + } else { + this.wizardService.removeWizardPreset(this.policyId); + } + }, + tokens, + schemas, + policies, + this.policyModel + ); + }, () => undefined, () => this.loading = false); + } } diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.css b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.css index 98e8e80568..0917757c0a 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.css +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.css @@ -455,6 +455,23 @@ grid-template-columns: auto 1px !important; } +.block-container[deprecated="true"] .block-item { + background-color: lightgray !important; + border-color: lightgray !important; +} + +.block-container[deprecated="true"] .block-item::after { + content: ""; + width: 110%; + height: 3px; + background-color: black; + position: absolute; + left: -5%; +} + +.block-container[selected="true"][deprecated="true"] .block-item { + border-color: #5161e1 !important; +} .cdk-drag-animating { transition: transform 50ms cubic-bezier(0, 0, 0.2, 1); diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.html b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.html index d15020c441..6c4730d866 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.html +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.html @@ -15,7 +15,7 @@ [attr.collapsed]="item.collapsed" [attr.selected]="isSelect(item)" [attr.error]="item.error" [attr.root]="item.root" [attr.block-id]="item.id" [attr.block-instance]="item.node.tag" [attr.block-type]="item.type" [style.paddingLeft]="item.offset" cdkDrag [cdkDragData]="item.level" - [cdkDragDisabled]="item.root"> + [cdkDragDisabled]="item.root" [attr.deprecated]="item.deprecated">
arrow_drop_down
diff --git a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.ts b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.ts index e728a49b5a..543c260282 100644 --- a/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-configuration/policy-tree/policy-tree.component.ts @@ -1,4 +1,4 @@ -import { Component, ComponentFactoryResolver, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core'; +import { Component, ComponentFactoryResolver, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core'; import { FlatBlockNode } from '../../structures/tree-model/block-node'; import { CdkDropList } from '@angular/cdk/drag-drop'; import { PolicyBlockModel, BlocLine, BlockRect, EventCanvas, PolicyModel, PolicyModuleModel } from '../../structures'; @@ -67,6 +67,7 @@ export class PolicyTreeComponent implements OnInit { private _allCollapse: string = '2'; private _visibleMoveActions: string = '0'; + private _resizeTimer: any = null; constructor( private registeredService: RegisteredService, @@ -219,6 +220,7 @@ export class PolicyTreeComponent implements OnInit { node.level = level; node.root = block === this.root; node.expandable = block.expandable && !node.root; + node.deprecated = this.registeredService.getDeprecated(block.blockType); node.about = this.registeredService.getAbout(block, this.module); node.icon = this.registeredService.getIcon(block.blockType); node.type = this.registeredService.getHeader(block.blockType); @@ -605,7 +607,19 @@ export class PolicyTreeComponent implements OnInit { return { type, data }; } - public blockStyle(node: FlatBlockNode):any { + public blockStyle(node: FlatBlockNode): any { return this.themeService.getStyle(node.node); } + + @HostListener('window:resize', ['$event']) + public onResize(event:any) { + if(this._resizeTimer) { + clearTimeout(this._resizeTimer); + this._resizeTimer = null; + } + this._resizeTimer = setTimeout(() => { + this._resizeTimer = null; + this.render(); + }, 200); + } } diff --git a/frontend/src/app/modules/policy-engine/policy-engine.module.ts b/frontend/src/app/modules/policy-engine/policy-engine.module.ts index 7da7c048f1..c35f9202bc 100644 --- a/frontend/src/app/modules/policy-engine/policy-engine.module.ts +++ b/frontend/src/app/modules/policy-engine/policy-engine.module.ts @@ -83,10 +83,12 @@ import { SelectBlock } from './helpers/select-block/select-block.component'; import { MultiPolicyDialogComponent } from './helpers/multi-policy-dialog/multi-policy-dialog.component'; import { ComparePolicyDialog } from './helpers/compare-policy-dialog/compare-policy-dialog.component'; import { NewModuleDialog } from './helpers/new-module-dialog/new-module-dialog.component'; +import { PolicyWizardDialogComponent } from './helpers/policy-wizard-dialog/policy-wizard-dialog.component'; //Modules import { ModulesListComponent } from './modules-list/modules-list.component'; -//Registered Service +//Services import { RegisteredService } from './services/registered.service'; +import { WizardService } from './services/wizard.service'; //Policies Grid import { PoliciesComponent } from './policies/policies.component'; //Routing @@ -95,6 +97,8 @@ import { NewPolicyDialog } from './helpers/new-policy-dialog/new-policy-dialog.c import { PolicySettingsComponent } from './policy-configuration/policy-settings/policy-settings.component'; import { ImportFileDialog } from './helpers/import-file-dialog/import-file-dialog.component'; import { NewThemeDialog } from './helpers/new-theme-dialog/new-theme-dialog.component'; +import { ExternalTopicBlockComponent } from './policy-viewer/blocks/external-topic-block/external-topic-block.component'; +import { UploadDocumentBlockComponent } from './policy-viewer/blocks/upload-document-block/upload-document-block.component'; @NgModule({ declarations: [ @@ -116,6 +120,7 @@ import { NewThemeDialog } from './helpers/new-theme-dialog/new-theme-dialog.comp SourceAddonConfigComponent, ActionBlockComponent, RequestDocumentBlockComponent, + UploadDocumentBlockComponent, ContainerBlockComponent, DocumentsSourceBlockComponent, PolicyViewerComponent, @@ -173,7 +178,9 @@ import { NewThemeDialog } from './helpers/new-theme-dialog/new-theme-dialog.comp NewPolicyDialog, PolicySettingsComponent, ImportFileDialog, - NewThemeDialog + NewThemeDialog, + ExternalTopicBlockComponent, + PolicyWizardDialogComponent, ], imports: [ CommonModule, @@ -190,7 +197,8 @@ import { NewThemeDialog } from './helpers/new-theme-dialog/new-theme-dialog.comp exports: [ ], providers: [ - RegisteredService + RegisteredService, + WizardService ] }) export class PolicyEngineModule { } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/action-block/action-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/action-block/action-block.component.ts index 38eb196244..ba5f8f1fe4 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/action-block/action-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/action-block/action-block.component.ts @@ -49,8 +49,8 @@ export class ActionBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -138,12 +138,15 @@ export class ActionBlockComponent implements OnInit { this.setObjectValue(this.data, this.field, value); this.value = this.getObjectValue(this.data, this.field); this.visible = this.options.findIndex((o: any) => o.value == this.value) == -1; - this.policyEngineService.setBlockData(this.id, this.policyId, this.data).subscribe(() => { - this.loadData(); - }, (e) => { - console.error(e.error); - this.loading = false; - }); + this.policyEngineService + .setBlockData(this.id, this.policyId, this.data) + .subscribe( + () => {}, + (e) => { + console.error(e.error); + this.loading = false; + } + ); } setStatus(row: any, status: string) { @@ -185,11 +188,14 @@ export class ActionBlockComponent implements OnInit { return; } this.setObjectValue(this.data, this.field, this.currentValue); - this.policyEngineService.setBlockData(this.id, this.policyId, this.data).subscribe(() => { - this.loadData(); - }, (e) => { - console.error(e.error); - this.loading = false; - }); + this.policyEngineService + .setBlockData(this.id, this.policyId, this.data) + .subscribe( + () => {}, + (e) => { + console.error(e.error); + this.loading = false; + } + ); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/button-block/button-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/button-block/button-block.component.ts index c71f3cecb1..5dc40569dc 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/button-block/button-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/button-block/button-block.component.ts @@ -71,8 +71,8 @@ export class ButtonBlockComponent implements OnInit, AfterContentChecked { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -181,12 +181,18 @@ export class ButtonBlockComponent implements OnInit, AfterContentChecked { onSelect(button: any) { this.setObjectValue(this.data, button.field, button.value); this.commonVisible = false; - this.policyEngineService.setBlockData(this.id, this.policyId, { document: this.data, tag: button.tag }).subscribe(() => { - this.loadData(); - }, (e) => { - console.error(e.error); - this.loading = false; - }); + this.policyEngineService + .setBlockData(this.id, this.policyId, { + document: this.data, + tag: button.tag, + }) + .subscribe( + () => {}, + (e) => { + console.error(e.error); + this.loading = false; + } + ); } onSelectDialog(button: any) { diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/container-block/container-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/container-block/container-block.component.ts index ce3fb5a17d..4901bd3a67 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/container-block/container-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/container-block/container-block.component.ts @@ -51,8 +51,8 @@ export class ContainerBlockComponent implements OnInit, OnDestroy { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/create-token-block/create-token-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/create-token-block/create-token-block.component.ts index f96db97b89..2f13a41879 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/create-token-block/create-token-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/create-token-block/create-token-block.component.ts @@ -76,8 +76,8 @@ export class CreateTokenBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/documents-source-block/documents-source-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/documents-source-block/documents-source-block.component.ts index 465578d2eb..80a73742a0 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/documents-source-block/documents-source-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/documents-source-block/documents-source-block.component.ts @@ -76,8 +76,8 @@ export class DocumentsSourceBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -331,6 +331,14 @@ export class DocumentsSourceBlockComponent implements OnInit { if (field.action == 'link') { this.onRedirect(row, field); } + if (field.action === 'download') { + const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(row.document)); + const href = document.createElement('a'); + href.setAttribute('href', dataStr); + href.setAttribute('download', `${row.document.id}.json`); + href.click(); + console.log('download', row, field); + } } onRedirect(row: any, field: any) { diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.css b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.css new file mode 100644 index 0000000000..f7a59dfa66 --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.css @@ -0,0 +1,210 @@ +.loading { + background: #fff; + position: fixed; + z-index: 99; + top: var(--header-height-policy); + left: 0; + bottom: 0; + right: 0; + display: flex; + align-items: center; + justify-items: center; + justify-content: center; + align-content: center; +} + +.sub-loading { + background: #fff; + position: absolute; + z-index: 9; + top: 0; + left: 0; + bottom: 0; + right: 0; + display: flex; + align-items: center; + justify-items: center; + justify-content: center; + align-content: center; + flex-direction: column; +} + +.page-content { + width: 800px; + min-height: 500px; + margin: 40px auto; + padding: 10px 10px 10px 10px; + border: 1px solid #c3c3c3; + border-radius: 4px; + position: relative; +} + +.form-content { + min-height: 350px; + width: 100%; + padding: 20px 0px; + position: relative; +} + +.form-buttons { + width: 100%; + position: relative; + height: 50px; + text-align: end; +} + +.form-buttons button { + margin-left: 18px; +} + +.content { + position: relative; +} + +.page { + width: 650px; + min-height: 150px; + margin: 40px auto; + padding: 10px; + border: 1px solid #c3c3c3; + border-radius: 4px; + position: relative; +} + +.form { + background: #fff; + color: #404040; + margin-bottom: 30px; + padding: 10px 35px; + display: flex; + flex-direction: column; +} + +.field { + display: flex; + flex-direction: row; + padding: 10px 20px; +} + +.field-name { + display: table-cell; + font-weight: bold; + color: #686868; + border-top: 2px solid #fff; + padding-top: 2px; + padding-bottom: 2px; + box-sizing: border-box; + min-width: 150px; + height: 30px; +} + +.field-value { + display: table-cell; + border-top: 2px solid #fff; + padding-top: 4px; + padding-bottom: 4px; + padding-right: 36px; + padding-left: 8px; + min-width: 240px; + position: relative; +} + +.schema-status-NOT_VERIFIED { + font-weight: 500; + text-align: end; +} + +.schema-status-INCOMPATIBLE { + color: #f44336; + font-weight: 500; + text-align: end; +} + +.schema-status-COMPATIBLE { + color: #4caf50; + font-weight: 500; + text-align: end; +} + +.form-link { + color: #0000ee; + width: 110px; + display: inline-block; + cursor: pointer; + padding: 10px 4px; +} + +.schema-row { + display: grid; + grid-template-columns: 40px auto 150px; + height: 40px; + padding-left: 15px; + box-sizing: border-box; +} + +.schema-row>div { + padding: 4px; +} + +.synchronization { + padding: 0px 30px 0px 0px; + height: 24px; + position: relative; + width: auto; + width: fit-content; +} + +.synchronization-time { + width: auto; +} + +.synchronization-update { + position: absolute; + top: -3px; + right: 0px; + display: block; + color: #005edf; + cursor: pointer; + height: 24px; + width: 24px; + line-height: 24px; + border-radius: 4px; +} + +.synchronization-update mat-icon { + position: absolute; + pointer-events: none; + font-size: 22px; + height: 22px; + width: 22px; + left: 1px; + top: 1px; +} + +.synchronization-update:hover { + background: #f1f1f1; +} + +.text { + padding-bottom: 16px; + padding-left: 15px; +} + +.text.note { + padding-bottom: 16px; +} + +.mat-form-field { + width: 100%; + padding-left: 15px; + box-sizing: border-box; +} + +.error-text { + padding-bottom: 24px; + font-size: 20px; +} + +.loading-text { + font-size: 18px; +} \ No newline at end of file diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.html b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.html new file mode 100644 index 0000000000..c25ed60144 --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.html @@ -0,0 +1,229 @@ +
+ +
+ +
+ + + description + + + +
+
+
+ Enter Hedera topic ID which contains messages about ingress VC documents. +
+ + * Topic Id + + +
+
+ +
+
+
+ + +
+
+ Selected topic belongs to the following policy: +
+
+
Policy Topic Id
+
{{policyTopicId}}
+
+
+
Policy Name
+
{{policyInstanceMessage.name}}
+
+
+
Policy Version
+
{{policyInstanceMessage.version}}
+
+
+
Instance Topic Id
+
{{instanceTopicId}}
+
+
+
Document Topic
+
{{documentMessage.name}}
+
+
+
Document Topic Id
+
{{documentTopicId}}
+
+
+
+ + +
+
+ + +
+
+
+ Select the ingress documents schema. Note: selected schema must be compatible with the current + policy. +
+
+ Only documents conforming to the schema would be accepted into the system. +
+ +
+
+ +
+
{{s.name}}
+
Need + verification
+
Incompatible +
+
Verified
+
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
Policy Topic Id
+
{{policyTopicId}}
+
+
+
Policy Name
+
{{policyInstanceMessage.name}}
+
+
+
Policy Version
+
{{policyInstanceMessage.version}}
+
+
+
Instance Topic Id
+
{{instanceTopicId}}
+
+
+
Document Topic
+
{{documentMessage.name}}
+
+
+
Document Topic Id
+
{{documentTopicId}}
+
+
+
Schema
+
{{schema.name}}
+
+
+
+ + +
+
+
+
+ +
+
+
Processing...
+
+
+ +
+
+
Search...
+
+
+ +
+
+
Verification...
+
+
+ +
+
+
+ An unexpected error occurred. +
+
+ +
+
+
+ +
+
+
+ Successfully registered source topic. Target documents will be loaded accordingly to the schedule. +
+
+ Note: manual refreshes can be trigged as required. +
+
+
Policy Topic Id
+
{{policyTopicId}}
+
+
+
Policy Name
+
{{policyInstanceMessage.name}}
+
+
+
Policy Version
+
{{policyInstanceMessage.version}}
+
+
+
Instance Topic Id
+
{{instanceTopicId}}
+
+
+
Document Topic
+
{{documentMessage.name}}
+
+
+
Document Topic Id
+
{{documentTopicId}}
+
+
+
Schema
+
{{schema.name}}
+
+
+
Last Update
+
+
+
{{lastUpdate}}
+
+ - +
+
+ sync +
+
+ +
+
+
+
\ No newline at end of file diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.ts new file mode 100644 index 0000000000..0f1e339621 --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/external-topic-block/external-topic-block.component.ts @@ -0,0 +1,222 @@ +import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { PolicyEngineService } from 'src/app/services/policy-engine.service'; +import { PolicyHelper } from 'src/app/services/policy-helper.service'; +import { WebSocketService } from 'src/app/services/web-socket.service'; + +/** + * Component for display block of 'external-topic' type. + */ +@Component({ + selector: 'external-topic-block', + templateUrl: './external-topic-block.component.html', + styleUrls: ['./external-topic-block.component.css'] +}) +export class ExternalTopicBlockComponent implements OnInit { + @Input('id') id!: string; + @Input('policyId') policyId!: string; + @Input('static') static!: any; + + loading: boolean = true; + socket: any; + + public documentTopicId: string | null = null; + public instanceTopicId: string | null = null; + public policyTopicId: string | null = null; + public documentMessage: any = null; + public policyInstanceMessage: any = null; + public policyMessage: any = null; + public schemas: any[] | null = null; + public schema: any = null; + public lastUpdate: string | null = null; + public status: string | null = null; + public stepIndex: number = 0; + public completed: boolean[] = []; + public editable: boolean[] = []; + + public topicForm = this.fb.group({ + topicId: ['', Validators.required] + }); + public schemaForm = this.fb.group({ + schemaId: ['', Validators.required] + }); + + constructor( + private policyEngineService: PolicyEngineService, + private wsService: WebSocketService, + private policyHelper: PolicyHelper, + private fb: FormBuilder, + private changeDetector: ChangeDetectorRef, + ) { + this.documentTopicId = null; + this.instanceTopicId = null; + this.policyTopicId = null; + this.documentMessage = null; + this.policyInstanceMessage = null; + this.policyMessage = null; + this.schemas = null; + this.schema = null; + this.lastUpdate = null; + } + + ngOnInit(): void { + if (!this.static) { + this.socket = this.wsService.blockSubscribe(this.onUpdate.bind(this)); + } + this.loadData(); + } + + ngOnDestroy(): void { + if (this.socket) { + this.socket.unsubscribe(); + } + } + + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { + this.loadData(); + } + } + + loadData() { + this.loading = true; + this.status = null; + if (this.static) { + this.setData(this.static); + setTimeout(() => { + this.loading = false; + }, 500); + } else { + this.policyEngineService.getBlockData(this.id, this.policyId).subscribe((data: any) => { + this.setData(data); + setTimeout(() => { + this.loading = false; + }, 1000); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + } + + setData(data: any) { + if (data) { + this.status = data.status || 'NEED_TOPIC'; + this.documentTopicId = data.documentTopicId; + this.instanceTopicId = data.instanceTopicId; + this.policyTopicId = data.policyTopicId; + this.documentMessage = data.documentMessage; + this.policyInstanceMessage = data.policyInstanceMessage; + this.policyMessage = data.policyMessage; + this.schemas = data.schemas || []; + this.schema = data.schema; + this.lastUpdate = data.lastUpdate; + switch (this.status) { + case 'NEED_TOPIC': + this.topicForm.reset(); + this.stepIndex = 0; + this.completed = [false, false, false, false, false]; + this.editable = [true, false, false, false, false]; + break; + case 'NEED_SCHEMA': + this.schemaForm.reset(); + const index = this.schemas?.findIndex(s=>s.status === 'INCOMPATIBLE' || s.status === 'COMPATIBLE'); + this.stepIndex = index === -1 ? 1 : 2; + this.completed = [true, true, false, false, false]; + this.editable = [false, true, true, false, false]; + break; + case 'FREE': + this.stepIndex = 3; + this.completed = [true, true, true, true, true]; + this.editable = [false, false, false, false, false]; + break; + default: + this.stepIndex = 0; + this.completed = [false, false, false, false, false]; + this.editable = [false, false, false, false, false]; + break; + } + } else { + this.status = null; + this.documentTopicId = null; + this.instanceTopicId = null; + this.policyTopicId = null; + this.documentMessage = null; + this.policyInstanceMessage = null; + this.policyMessage = null; + this.schemas = null; + this.schema = null; + this.lastUpdate = null; + this.stepIndex = 0; + } + } + + public setTopic() { + this.loading = true; + const form = this.topicForm.value; + const data = { + operation: 'SetTopic', + value: form?.topicId + }; + this.policyEngineService.setBlockData(this.id, this.policyId, data).subscribe(() => { + this.loadData(); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + + public setSchema() { + this.loading = true; + const form = this.schemaForm.value; + const data = { + operation: 'SetSchema', + value: form?.schemaId + }; + this.policyEngineService.setBlockData(this.id, this.policyId, data).subscribe(() => { + this.loadData(); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + + public onRefresh() { + this.loading = true; + const data = { + operation: 'LoadDocuments' + }; + this.policyEngineService.setBlockData(this.id, this.policyId, data).subscribe(() => { + this.loadData(); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + + public restart() { + this.loading = true; + const data = { + operation: 'Restart' + }; + this.policyEngineService.setBlockData(this.id, this.policyId, data).subscribe(() => { + this.loadData(); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + + public verificationAll() { + this.loading = true; + const data = { + operation: 'VerificationSchemas' + }; + this.policyEngineService.setBlockData(this.id, this.policyId, data).subscribe(() => { + this.loadData(); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } +} diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/filters-addon-block/filters-addon-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/filters-addon-block/filters-addon-block.component.ts index f013caa8c7..719d582b71 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/filters-addon-block/filters-addon-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/filters-addon-block/filters-addon-block.component.ts @@ -47,8 +47,8 @@ export class FiltersAddonBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/group-manager-block/group-manager-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/group-manager-block/group-manager-block.component.ts index 0118ecd654..65a280f2c8 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/group-manager-block/group-manager-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/group-manager-block/group-manager-block.component.ts @@ -72,8 +72,8 @@ export class GroupManagerBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/information-block/information-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/information-block/information-block.component.ts index 3e0ed7c39a..46f16f2718 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/information-block/information-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/information-block/information-block.component.ts @@ -45,8 +45,8 @@ export class InformationBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/multi-sign-block/multi-sign-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/multi-sign-block/multi-sign-block.component.ts index 4a6382aff6..311d05cab1 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/multi-sign-block/multi-sign-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/multi-sign-block/multi-sign-block.component.ts @@ -54,8 +54,8 @@ export class MultiSignBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/report-block/report-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/report-block/report-block.component.ts index c0f9b6e8f4..836c5c01c7 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/report-block/report-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/report-block/report-block.component.ts @@ -81,8 +81,8 @@ export class ReportBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.css b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.css index cf91d52af1..31d6746e8a 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.css +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.css @@ -64,9 +64,10 @@ .body-dialog-template { margin: 0; padding: 0; - padding-bottom: 70px; - max-height: calc(70 * var(--vh)) !important; + padding-bottom: 20px; + max-height: calc(65vh + 40px) !important; position: relative; + overflow: visible; } .description { @@ -88,7 +89,7 @@ padding: 0 40px; } -.form-page .page-btns { +.form-page .page-btns { padding: 0px 40px 40px 40px; } @@ -133,7 +134,30 @@ margin-left: 3px; } +.registrant-application-create-btn { + display: none; +} + @media (max-width: 810px) { + .loading { + top: 75px; + z-index: 999; + } + + .loading-dialog { + position: fixed; + top: 75px; + z-index: 999; + bottom: 0; + } + + .page-btns { + display: none !important; + } + + .dialog-actions-container { + display: none !important; + } h1 { height: 40px; @@ -160,10 +184,10 @@ .form-dialog { width: 90%; margin: 0 auto; - padding: 0; + padding: 0px 0px 0px 0px; border: none; - max-height: 55vh; - max-width: 90vh; + max-height: none; + max-width: 90vw; } .schema-form { @@ -185,6 +209,7 @@ } .registrant-application-create-btn { + display: block !important; position: fixed; width: calc(45% - 5px); right: 5%; @@ -208,7 +233,7 @@ display: grid; grid-template-columns: 1fr 1fr; column-gap: 10px; - + background-color: white; margin-bottom: 0; padding: 20px 0; diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.html b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.html index 170d43800b..eef73ae168 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.html +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.html @@ -14,12 +14,12 @@

{{title}}

+ [preset]="presetDocument" [readonly-fields]="presetReadonlyFields" submitText="Create" + (cancelBtnEvent)="onCancelPage($event)" (submitBtnEvent)="onSubmit()">
- -
- +
+
@@ -47,15 +47,17 @@

{{data.dialogContent}}

- +
-
+
+ [disabled]="!data.dataForm.valid || loading || dialogLoading">Create
@@ -65,4 +67,4 @@

{{data.dialogContent}}

- \ No newline at end of file + diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.ts index 0dabfe3f57..5537b6db7e 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/request-document-block/request-document-block.component.ts @@ -7,6 +7,7 @@ import { PolicyHelper } from 'src/app/services/policy-helper.service'; import { ProfileService } from 'src/app/services/profile.service'; import { global } from '@angular/compiler/src/util'; import { WebSocketService } from 'src/app/services/web-socket.service'; +import { Router } from '@angular/router'; /** * Component for display block of 'requestVcDocument' types. @@ -47,9 +48,6 @@ export class RequestDocumentBlockComponent implements OnInit { user!: IUser; restoreData: any; - public innerWidth: any; - public innerHeight: any; - constructor( private policyEngineService: PolicyEngineService, private wsService: WebSocketService, @@ -57,14 +55,13 @@ export class RequestDocumentBlockComponent implements OnInit { private policyHelper: PolicyHelper, private fb: FormBuilder, private dialog: MatDialog, + private router: Router, private changeDetectorRef: ChangeDetectorRef ) { this.dataForm = fb.group({}); } ngOnInit(): void { - this.innerWidth = window.innerWidth; - this.innerHeight = window.innerHeight; if (!this.static) { this.socket = this.wsService.blockSubscribe(this.onUpdate.bind(this)); } @@ -84,8 +81,8 @@ export class RequestDocumentBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -264,13 +261,13 @@ export class RequestDocumentBlockComponent implements OnInit { this.presetDocument = null; } - if (this.innerWidth <= 810) { + if (window.innerWidth <= 810) { const bodyStyles = window.getComputedStyle(document.body); const headerHeight: number = parseInt(bodyStyles.getPropertyValue('--header-height')); this.dialogRef = this.dialog.open(this.dialogTemplate, { width: `100vw`, maxWidth: '100vw', - height: `${this.innerHeight - headerHeight}px`, + height: `${window.innerHeight - headerHeight}px`, position: { 'bottom': '0' }, @@ -308,4 +305,8 @@ export class RequestDocumentBlockComponent implements OnInit { data.onSubmit(); } } + + onCancelPage(value: boolean) { + this.router.navigate(['/policy-viewer']); + } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/roles-block/roles-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/roles-block/roles-block.component.ts index cc2493550a..6fa018f5d0 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/roles-block/roles-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/roles-block/roles-block.component.ts @@ -69,8 +69,8 @@ export class RolesBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -147,7 +147,7 @@ export class RolesBlockComponent implements OnInit { this.policyEngineService .setBlockData(this.id, this.policyId, data) .subscribe( - () => undefined, + () => {}, (e) => { console.error(e.error); this.loading = false; diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/step-block/step-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/step-block/step-block.component.ts index 439fc966a9..6026531653 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/step-block/step-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/step-block/step-block.component.ts @@ -54,8 +54,8 @@ export class StepBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/tags-manager-block/tags-manager-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/tags-manager-block/tags-manager-block.component.ts index 7f466cd3e1..10f3d31081 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/tags-manager-block/tags-manager-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/tags-manager-block/tags-manager-block.component.ts @@ -69,8 +69,8 @@ export class TagsManagerBlockComponent implements OnInit { } } - public onUpdate(id: string): void { - if (this.id == id) { + public onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.html b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.html index 866250eaca..0aca1e58e3 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.html +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.html @@ -26,7 +26,6 @@ I have {{action === 'associate' ? 'associated' : action === 'dissociate' ? 'dissociated' : action}} manually -
diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.ts index 52d9f0f276..3cff25a72a 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.ts +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/token-confirmation-block/token-confirmation-block.component.ts @@ -60,8 +60,8 @@ export class TokenConfirmationBlockComponent implements OnInit { } } - onUpdate(id: string): void { - if (this.id == id) { + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { this.loadData(); } } @@ -111,7 +111,7 @@ export class TokenConfirmationBlockComponent implements OnInit { action: 'confirm', }) .subscribe( - () => undefined, + () => {}, (e) => { console.error(e.error); this.loading = false; diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.css b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.css new file mode 100644 index 0000000000..c6e9129a9e --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.css @@ -0,0 +1,250 @@ +.content-page { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + display: block; + background: #fff; + margin: 10px 5px 5px 5px; + box-shadow: 0px 2px 4px -1px rgb(0 0 0 / 20%), 0px 4px 5px 0px rgb(0 0 0 / 14%), 0px 1px 10px 0px rgb(0 0 0 / 12%); +} + +.content-dialog { + display: block; + background: transparent; + margin: 10px 5px 5px 5px; +} + +.loading { + background: #fff; + position: fixed; + z-index: 99; + top: var(--header-height-policy); + left: 0; + bottom: 0; + right: 0; + display: flex; + align-items: center; + justify-items: center; + justify-content: center; + align-content: center; +} + +.loading-dialog { + background: #fff; + position: absolute; + z-index: 99; + top: 0; + left: 0; + bottom: 62px; + right: 0; + display: flex; + align-items: center; + justify-items: center; + justify-content: center; + align-content: center; +} + +.form-page { + width: 650px; + margin: 40px auto; + padding: 10px; + border: 1px solid #c3c3c3; + border-radius: 4px; +} + +.form-dialog { + padding: 10px 40px 20px 40px; + max-height: 65vh; + overflow: auto; + box-sizing: border-box; +} + +.body-dialog-template { + margin: 0; + padding: 0; + padding-bottom: 70px; + max-height: calc(70 * var(--vh)) !important; + position: relative; + overflow: visible; +} + +.description { + margin-bottom: 10px; +} + +.schema-form { + max-height: calc(100vh - 580px); + overflow: auto; + margin-bottom: 24px; + padding: 40px 40px 0px 40px; +} + +.form-page h1 { + padding: 40px 40px 0px 40px; +} + +.form-page .description { + padding: 0 40px; +} + +.form-page .page-btns { + padding: 0px 40px 40px 40px; +} + +.content-dialog button { + height: 40px; + margin-bottom: 6px; +} + +.btn-block-link { + width: auto !important; + font-size: 20px !important; + color: #0B73F8 !important; + text-decoration: none !important; + border-bottom: 3px solid #0C77FF; + padding: 0 0 3px 0 !important; + margin: 0 !important; + font-weight: normal !important; + background-color: transparent !important; + box-shadow: none !important; + border-radius: 0 !important; + height: 33px !important; + box-sizing: border-box !important; + position: relative !important; + top: -9px !important; +} + +.restore-data { + margin-top: 10px; + margin-left: 40px; + display: flex; + align-items: center; + gap: 10px; + color: var(--primary-color); +} + +.restore-data button.mat-raised-button { + padding: 0 12px; + height: 36px; +} + +.restore-data button mat-icon { + margin-left: 3px; +} + +@media (max-width: 810px) { + + h1 { + height: 40px; + padding: 0 !important; + margin: 0 auto; + margin-top: 16px; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 600; + font-size: 24px; + line-height: 28px; + + color: #222222; + } + + .form-page { + width: 90%; + margin: 0 auto; + padding: 0; + border: none; + } + + .form-dialog { + width: 90%; + margin: 0 auto; + padding: 0; + border: none; + max-height: 55vh; + max-width: 90vh; + } + + .schema-form { + max-height: none; + width: 100%; + margin: 0 auto; + padding: 0; + overflow: auto; + margin-bottom: 24px; + } + + .mobile-button-div { + background-color: #333; + color: #fff; + padding: 30px 0; + position: fixed; + width: 100%; + bottom: 0; + } + + .registrant-application-create-btn { + position: fixed; + width: calc(45% - 5px); + right: 5%; + left: auto; + bottom: 20px; + z-index: 305; + } + + /* Create New Device */ + + .title { + width: 90%; + } + + :host ::ng-deep .form-dialog .form-field-group { + margin-bottom: 0; + } + + .mat-dialog-actions { + width: 90%; + display: grid; + grid-template-columns: 1fr 1fr; + column-gap: 10px; + + background-color: white; + margin-bottom: 0; + padding: 20px 0; + position: fixed; + bottom: 0; + left: 50%; + right: auto; + transform: translateX(-50%); + z-index: 305; + } + + #cancel-btn { + border: 1px solid #2C78F6; + background: none !important; + color: #2C78F6; + grid-column: 1; + grid-row: 1; + z-index: 305; + } + + #ok-btn { + grid-column: 2; + grid-row: 1; + z-index: 305; + } +} + +.upload-area { + margin: auto; + width: 600px; +} + +.page-header { + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; +} diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.html b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.html new file mode 100644 index 0000000000..770e62a50b --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.html @@ -0,0 +1,38 @@ +
+
+ +
+ +
+ + + +
+
+ + + +
+ + +
+

{{data.dialogTitle}}

+
+ {{dialogDescription}} +
+
+
+ +
+ + +
+
+ +
+
+
diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.ts b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.ts new file mode 100644 index 0000000000..5d11c7f41c --- /dev/null +++ b/frontend/src/app/modules/policy-engine/policy-viewer/blocks/upload-document-block/upload-document-block.component.ts @@ -0,0 +1,181 @@ +import { ChangeDetectorRef, Component, Input, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { IUser } from '@guardian/interfaces'; +import { PolicyEngineService } from 'src/app/services/policy-engine.service'; +import { PolicyHelper } from 'src/app/services/policy-helper.service'; +import { ProfileService } from 'src/app/services/profile.service'; +import { WebSocketService } from 'src/app/services/web-socket.service'; + +/** + * Component for display block of 'requestVcDocument' types. + */ +@Component({ + selector: 'request-document-block', + templateUrl: './upload-document-block.component.html', + styleUrls: ['./upload-document-block.component.css'] +}) +export class UploadDocumentBlockComponent implements OnInit { + @Input('id') id!: string; + @Input('policyId') policyId!: string; + @Input('static') static!: any; + @ViewChild("dialogTemplate") dialogTemplate!: TemplateRef; + + isExist = false; + disabled = false; + loading: boolean = true; + socket: any; + dialogLoading: boolean = false; + type!: string; + buttonText: string = ''; + dialogTitle: string = ''; + dialogClass: string = ''; + dialogRef: any; + pageTitle: string = ''; + pageDescription: string = ''; + dialogDescription: string = ''; + buttonClass: string = ''; + + public items: unknown[] = [] + + constructor( + private policyEngineService: PolicyEngineService, + private wsService: WebSocketService, + private profile: ProfileService, + private policyHelper: PolicyHelper, + private dialog: MatDialog, + ) { + } + + ngOnInit(): void { + if (!this.static) { + this.socket = this.wsService.blockSubscribe(this.onUpdate.bind(this)); + } + this.loadData(); + } + + ngOnDestroy(): void { + if (this.socket) { + this.socket.unsubscribe(); + } + } + + onUpdate(blocks: string[]): void { + if (Array.isArray(blocks) && blocks.includes(this.id)) { + this.loadData(); + } + } + + loadData() { + this.loading = true; + if (this.static) { + this.setData(this.static); + setTimeout(() => { + this.loading = false; + }, 500); + } else { + this.policyEngineService.getBlockData(this.id, this.policyId).subscribe((data: any) => { + this.setData(data); + setTimeout(() => { + this.loading = false; + }, 500); + }, (e) => { + console.error(e.error); + this.loading = false; + }); + } + } + + setData(data: any) { + if (data) { + this.type = data.uiMetaData.type; + if (this.type == 'dialog') { + this.buttonText = data.uiMetaData.buttonText; + this.buttonClass = data.uiMetaData.buttonClass; + this.dialogTitle = data.uiMetaData.dialogTitle; + this.dialogClass = data.uiMetaData.dialogClass; + this.dialogDescription = data.uiMetaData.dialogDescription; + } + if (this.type == 'page') { + this.pageTitle = data.uiMetaData.pageTitle; + this.pageDescription = data.uiMetaData.pageDescription; + } + this.disabled = false; + this.isExist = true; + } else { + this.disabled = false; + this.isExist = false; + } + } + + onSubmit($event: any) { + this.dialogLoading = true; + this.loading = true; + this.policyEngineService.setBlockData(this.id, this.policyId, { + documents: this.items, + }).subscribe(() => { + setTimeout(() => { + if (this.dialogRef) { + this.dialogRef.close(); + this.dialogRef = null; + } + this.dialogLoading = false; + }, 1000); + }, (e) => { + console.error(e.error); + this.dialogLoading = false; + this.loading = false; + }); + } + + onCancel(): void { + if (this.dialogRef) { + this.dialogRef.close(); + this.dialogRef = null; + } + } + + onDialog() { + if (window.innerWidth <= 810) { + const bodyStyles = window.getComputedStyle(document.body); + const headerHeight: number = parseInt(bodyStyles.getPropertyValue('--header-height')); + this.dialogRef = this.dialog.open(this.dialogTemplate, { + width: `100vw`, + maxWidth: '100vw', + height: `${window.innerHeight - headerHeight}px`, + position: { + 'bottom': '0' + }, + panelClass: 'g-dialog', + hasBackdrop: true, // Shadows beyond the dialog + closeOnNavigation: true, + autoFocus: false, + data: this + }); + } else { + this.dialogRef = this.dialog.open(this.dialogTemplate, { + width: '850px', + disableClose: true, + data: this + }); + } + } + + onDrop(files: any): void { + for (const file of files) { + const reader = new FileReader(); + reader.addEventListener('load', (event: any) => { + this.items.push(JSON.parse(event.target.result)) + }) + reader.readAsText(file); + } + } + + uploadText(): string { + if (this.items.length === 0) { + return 'Drop file here'; + } + return `${this.items.length} files added` + + } +} diff --git a/frontend/src/app/modules/policy-engine/policy-viewer/policy-viewer/policy-viewer.component.css b/frontend/src/app/modules/policy-engine/policy-viewer/policy-viewer/policy-viewer.component.css index 2e1b10230a..adee5b593e 100644 --- a/frontend/src/app/modules/policy-engine/policy-viewer/policy-viewer/policy-viewer.component.css +++ b/frontend/src/app/modules/policy-engine/policy-viewer/policy-viewer/policy-viewer.component.css @@ -440,6 +440,10 @@ a.go-back-link mat-icon { border: none; } + .policy-header[policy-status='DRY-RUN'] { + top: 45px; + } + .dry-run-content { top: var(--header-height); } diff --git a/frontend/src/app/modules/policy-engine/services/blocks-information.ts b/frontend/src/app/modules/policy-engine/services/blocks-information.ts index 3859237e80..ad2ae8a9ec 100644 --- a/frontend/src/app/modules/policy-engine/services/blocks-information.ts +++ b/frontend/src/app/modules/policy-engine/services/blocks-information.ts @@ -40,14 +40,17 @@ import { MultiSignBlockComponent } from '../policy-viewer/blocks/multi-sign-bloc import { CreateTokenConfigComponent } from '../policy-configuration/blocks/tokens/create-token-config/create-token-config.component'; import { CreateTokenBlockComponent } from '../policy-viewer/blocks/create-token-block/create-token-block.component'; import { HttpRequestConfigComponent } from '../policy-configuration/blocks/main/http-request-config/http-request-config.component'; +import { ExternalTopicBlockComponent } from '../policy-viewer/blocks/external-topic-block/external-topic-block.component'; +import { UploadDocumentBlockComponent } from '../policy-viewer/blocks/upload-document-block/upload-document-block.component'; + import { - BlockType, BlockGroup, BlockHeaders, PolicyBlockModel, IBlockSetting } from "../structures"; import { TagsManagerBlockComponent } from '../policy-viewer/blocks/tags-manager-block/tags-manager-block.component'; +import { BlockType } from '@guardian/interfaces'; const Container: IBlockSetting = { type: BlockType.Container, @@ -67,6 +70,7 @@ const Container: IBlockSetting = { { type: BlockType.HttpRequest }, { type: BlockType.DocumentsViewer }, { type: BlockType.Request }, + { type: BlockType.Upload }, { type: BlockType.SendToGuardian }, { type: BlockType.ExternalData }, { type: BlockType.AggregateDocument }, @@ -78,6 +82,7 @@ const Container: IBlockSetting = { { type: BlockType.CustomLogicBlock }, { type: BlockType.Report }, { type: BlockType.RevokeBlock }, + { type: BlockType.RevocationBlock }, { type: BlockType.SetRelationshipsBlock }, { type: BlockType.ButtonBlock }, { type: BlockType.TokenActionBlock }, @@ -85,7 +90,8 @@ const Container: IBlockSetting = { { type: BlockType.DocumentValidatorBlock }, { type: BlockType.MultiSignBlock }, { type: BlockType.CreateToken }, - { type: BlockType.SplitBlock } + { type: BlockType.SplitBlock }, + { type: BlockType.ExternalTopic } ] } @@ -107,6 +113,7 @@ const Step: IBlockSetting = { { type: BlockType.HttpRequest }, { type: BlockType.DocumentsViewer }, { type: BlockType.Request }, + { type: BlockType.Upload }, { type: BlockType.SendToGuardian }, { type: BlockType.ExternalData }, { type: BlockType.AggregateDocument }, @@ -118,6 +125,7 @@ const Step: IBlockSetting = { { type: BlockType.CustomLogicBlock }, { type: BlockType.Report }, { type: BlockType.RevokeBlock }, + { type: BlockType.RevocationBlock }, { type: BlockType.SetRelationshipsBlock }, { type: BlockType.ButtonBlock }, { type: BlockType.TokenActionBlock }, @@ -125,7 +133,8 @@ const Step: IBlockSetting = { { type: BlockType.DocumentValidatorBlock }, { type: BlockType.MultiSignBlock }, { type: BlockType.CreateToken }, - { type: BlockType.SplitBlock } + { type: BlockType.SplitBlock }, + { type: BlockType.ExternalTopic } ] } @@ -284,6 +293,22 @@ const Request: IBlockSetting = { }] } +const Upload: IBlockSetting = { + type: BlockType.Upload, + icon: 'dynamic_form', + group: BlockGroup.Documents, + header: BlockHeaders.UIComponents, + factory: UploadDocumentBlockComponent, + property: null, + allowedChildren: [{ + type: BlockType.DocumentsSourceAddon, + group: BlockGroup.UnGrouped + }, { + type: BlockType.DocumentValidatorBlock, + group: BlockGroup.UnGrouped + }] +} + const MultiSignBlock: IBlockSetting = { type: BlockType.MultiSignBlock, icon: 'done_all', @@ -315,6 +340,19 @@ const ExternalData: IBlockSetting = { }] } +const ExternalTopic: IBlockSetting = { + type: BlockType.ExternalTopic, + icon: 'cloud', + group: BlockGroup.Documents, + header: BlockHeaders.UIComponents, + factory: ExternalTopicBlockComponent, + property: null, + allowedChildren: [{ + type: BlockType.DocumentValidatorBlock, + group: BlockGroup.UnGrouped + }] +} + const AggregateDocument: IBlockSetting = { type: BlockType.AggregateDocument, icon: 'calendar_month', @@ -342,6 +380,15 @@ const RevokeBlock: IBlockSetting = { property: RevokeConfigComponent, } +const RevocationBlock: IBlockSetting = { + type: BlockType.RevocationBlock, + icon: 'restart_alt', + group: BlockGroup.Documents, + header: BlockHeaders.ServerBlocks, + factory: null, + property: null, +} + const SetRelationshipsBlock: IBlockSetting = { type: BlockType.SetRelationshipsBlock, icon: 'settings', @@ -582,12 +629,14 @@ export default [ HttpRequest, DocumentsViewer, Request, + Upload, MultiSignBlock, SendToGuardian, ExternalData, AggregateDocument, ReassigningBlock, RevokeBlock, + RevocationBlock, SetRelationshipsBlock, SplitBlock, FiltersAddon, @@ -609,5 +658,6 @@ export default [ ReportItem, HistoryAddon, SelectiveAttributes, - TagManager -]; \ No newline at end of file + TagManager, + ExternalTopic +]; diff --git a/frontend/src/app/modules/policy-engine/services/module-information.ts b/frontend/src/app/modules/policy-engine/services/module-information.ts index d017b72e97..39a9e5ec61 100644 --- a/frontend/src/app/modules/policy-engine/services/module-information.ts +++ b/frontend/src/app/modules/policy-engine/services/module-information.ts @@ -1,7 +1,7 @@ import { ModuleComponent } from "../policy-configuration/blocks/module/module.component"; import { ContainerBlockComponent } from "../policy-viewer/blocks/container-block/container-block.component"; +import { BlockType } from '@guardian/interfaces'; import { - BlockType, BlockGroup, BlockHeaders, IBlockAbout, @@ -31,6 +31,7 @@ const Module: IBlockSetting = { { type: BlockType.HttpRequest }, { type: BlockType.DocumentsViewer }, { type: BlockType.Request }, + { type: BlockType.Upload }, { type: BlockType.SendToGuardian }, { type: BlockType.ExternalData }, { type: BlockType.AggregateDocument }, @@ -42,6 +43,7 @@ const Module: IBlockSetting = { { type: BlockType.CustomLogicBlock }, { type: BlockType.Report }, { type: BlockType.RevokeBlock }, + { type: BlockType.RevocationBlock }, { type: BlockType.SetRelationshipsBlock }, { type: BlockType.ButtonBlock }, { type: BlockType.TokenActionBlock }, @@ -74,4 +76,4 @@ const Module: IBlockSetting = { export default [ Module, -]; \ No newline at end of file +]; diff --git a/frontend/src/app/modules/policy-engine/services/registered.service.ts b/frontend/src/app/modules/policy-engine/services/registered.service.ts index 2dc0f686ad..657e414a77 100644 --- a/frontend/src/app/modules/policy-engine/services/registered.service.ts +++ b/frontend/src/app/modules/policy-engine/services/registered.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { GenerateUUIDv4 } from '@guardian/interfaces'; -import { BlockAbout, BlockType, ChildrenType, ControlType, IBlockAbout, IBlockSetting, PolicyBlockModel, PolicyModel, PolicyModuleModel } from '../structures'; +import { BlockType, GenerateUUIDv4 } from '@guardian/interfaces'; +import { BlockAbout, ChildrenType, ControlType, IBlockAbout, IBlockSetting, PolicyBlockModel, PolicyModel, PolicyModuleModel } from '../structures'; import blocks from './blocks-information'; import modules from './module-information'; @@ -19,6 +19,7 @@ export class RegisteredService { private blockName: { [type: string]: string }; private blockTitle: { [type: string]: string }; + private blockDeprecation: { [type: string]: boolean }; private blockAbout: { [type: string]: BlockAbout }; private blockProperties: { [type: string]: BlockAbout }; @@ -38,6 +39,7 @@ export class RegisteredService { this.blockTitle = {}; this.blockAbout = {}; this.blockProperties = {}; + this.blockDeprecation = {}; this.defaultAbout = new BlockAbout({ post: false, get: false, @@ -45,7 +47,8 @@ export class RegisteredService { output: null, children: ChildrenType.None, control: ControlType.None, - defaultEvent: false + defaultEvent: false, + deprecated: false, }) for (const config of blocks) { @@ -103,6 +106,7 @@ export class RegisteredService { this.blockTitle[type] = setting.title; this.blockAbout[type] = new BlockAbout(setting, this.about[type]); this.blockProperties[type] = setting.properties; + this.blockDeprecation[type] = !!setting.deprecated; } this.update(); } @@ -119,7 +123,8 @@ export class RegisteredService { group: this.group[type], header: this.header[type], title: this.blockTitle[type], - data: `new:${type}` + data: `new:${type}`, + deprecated: this.blockDeprecation[type], }); } this.list = this.list.sort((a, b) => a.name > b.name ? 1 : -1); @@ -181,4 +186,8 @@ export class RegisteredService { public getHeader(blockType: string): string { return this.header[blockType] || ''; } -} + + public getDeprecated(blockType: string): boolean { + return this.blockDeprecation[blockType]; + } + } diff --git a/frontend/src/app/modules/policy-engine/services/wizard.service.ts b/frontend/src/app/modules/policy-engine/services/wizard.service.ts new file mode 100644 index 0000000000..389c78bcb6 --- /dev/null +++ b/frontend/src/app/modules/policy-engine/services/wizard.service.ts @@ -0,0 +1,226 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { API_BASE_URL } from '../../../services/api'; +import { IWizardConfig, Schema, Token } from '@guardian/interfaces'; +import { SelectorDialogComponent } from '../../common/selector-dialog/selector-dialog.component'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmationDialogComponent } from '../../common/confirmation-dialog/confirmation-dialog.component'; +import { PolicyWizardDialogComponent } from '../helpers/policy-wizard-dialog/policy-wizard-dialog.component'; + +export enum WizardMode { + CREATE = 'CREATE', + EDIT = 'EDIT', +} + +/** + * Services for working with wizard. + */ +@Injectable() +export class WizardService { + private readonly url: string = `${API_BASE_URL}/wizard`; + + constructor(private http: HttpClient, private dialog: MatDialog) {} + + public createPolicyAsync( + config: any + ): Observable<{ taskId: string; expectation: number }> { + return this.http.post<{ taskId: string; expectation: number }>( + `${this.url}/policy/push`, + config + ); + } + + public getPolicyConfig( + policyId: string, + config: any + ): Observable<{ wizardConfig: IWizardConfig; policyConfig: any }> { + return this.http.post(`${this.url}/${policyId}/config`, config); + } + + public removeWizardPreset(policyId: string) { + if (!policyId) { + return; + } + try { + const wizardStates = JSON.parse( + localStorage.getItem('wizard') || 'null' + ); + delete wizardStates[policyId]; + localStorage.setItem('wizard', JSON.stringify(wizardStates)); + } catch {} + } + + public setWizardPreset(policyId: string, preset: any) { + if (!preset || !policyId) { + return; + } + try { + const wizardStates = JSON.parse( + localStorage.getItem('wizard') || 'null' + ); + wizardStates[policyId] = preset; + localStorage.setItem('wizard', JSON.stringify(wizardStates)); + } catch { + const wizardStates: any = {}; + wizardStates[policyId] = preset; + localStorage.setItem('wizard', JSON.stringify(wizardStates)); + } + } + + private openSaveWizardStateDialog( + callback: (value: { + create: boolean; + config: IWizardConfig; + currentNode: any; + saveState: boolean; + }) => void, + value: { + create: boolean; + config: IWizardConfig; + currentNode: any; + } + ) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + data: { + dialogTitle: 'Save progress', + dialogText: 'Do you want to save progress?', + }, + }); + dialogRef.afterClosed().subscribe((saveState) => { + callback(Object.assign(value, { saveState })); + }); + } + + private openWizardDialog( + mode: WizardMode, + callback: (value: { + create: boolean; + config: IWizardConfig; + currentNode: any; + saveState: boolean; + }) => void, + tokens: Token[], + schemas: Schema[], + policies: any[], + policy?: any, + preset?: any + ) { + const dialogRef = this.dialog.open(PolicyWizardDialogComponent, { + width: '1100px', + panelClass: 'g-dialog', + disableClose: true, + autoFocus: false, + data: { + policy, + policies, + schemas, + tokens, + state: preset, + }, + }); + dialogRef + .afterClosed() + .subscribe( + (value: { + create: boolean; + config: IWizardConfig; + currentNode: any; + }) => { + if (!value.create && mode === WizardMode.CREATE) { + return; + } + this.openSaveWizardStateDialog(callback, value); + } + ); + } + + public openPolicyWizardDialog( + mode: WizardMode, + callback: (value: { + create: boolean; + config: IWizardConfig; + currentNode: any; + saveState: boolean; + }) => void, + tokens: Token[], + schemas: Schema[], + policies: any[], + policy?: any + ) { + try { + const wizardStates = JSON.parse( + localStorage.getItem('wizard') || 'null' + ); + if (!wizardStates) { + this.openWizardDialog( + mode, + callback, + tokens, + schemas, + policies, + policy + ); + return; + } + const wizardPolicies = Object.keys(wizardStates); + const options: any = policies + ?.filter((policy) => wizardPolicies.includes(policy.id)) + .map((policy) => + Object({ + name: policy.name, + value: policy.id, + topicId: policy.topicId, + }) + ); + if (!options.length) { + this.openWizardDialog( + mode, + callback, + tokens, + schemas, + policies, + policy + ); + return; + } + const selectorDialog = this.dialog.open(SelectorDialogComponent, { + width: '400px', + data: { + title: 'Restore progress', + description: 'Choose policy', + label: 'New policy', + options: [ + { + name: 'New policy', + }, + ].concat(options), + }, + }); + selectorDialog.afterClosed().subscribe((value) => { + if (!value?.ok) { + return; + } + this.openWizardDialog( + mode, + callback, + tokens, + schemas, + policies, + policy, + value?.result && wizardStates[value.result] + ); + }); + } catch (error) { + localStorage.removeItem('wizard'); + this.openWizardDialog( + mode, + callback, + tokens, + schemas, + policies, + policy + ); + } + } +} diff --git a/frontend/src/app/modules/policy-engine/structures/index.ts b/frontend/src/app/modules/policy-engine/structures/index.ts index f59c7cc2dc..c5be9e069f 100644 --- a/frontend/src/app/modules/policy-engine/structures/index.ts +++ b/frontend/src/app/modules/policy-engine/structures/index.ts @@ -27,7 +27,6 @@ export { EventCanvas } from './tree-model/event-canvas'; export { BlocLine } from './tree-model/event-line'; export { BlockGroup } from './types/block-group.type'; export { BlockHeaders } from './types/block-headers.type'; -export { BlockType } from './types/block-type.type'; export { ChildrenType } from './types/children-type.type'; export { ControlType } from './types/control-type.type'; export { IModuleVariables } from './policy-models/variables/module-variables.interface'; @@ -40,4 +39,4 @@ export { TopicVariables } from './policy-models/variables/topic-variables'; export { TemplateModel } from './policy-models/template.model'; export { ThemeRule } from './storage/theme-rule'; export { Theme } from './storage/theme'; -export { ThemeSettings } from './storage/theme-settings'; \ No newline at end of file +export { ThemeSettings } from './storage/theme-settings'; diff --git a/frontend/src/app/modules/policy-engine/structures/interfaces/block-about-config.interface.ts b/frontend/src/app/modules/policy-engine/structures/interfaces/block-about-config.interface.ts index 6972e856fd..7425d0aa5c 100644 --- a/frontend/src/app/modules/policy-engine/structures/interfaces/block-about-config.interface.ts +++ b/frontend/src/app/modules/policy-engine/structures/interfaces/block-about-config.interface.ts @@ -9,4 +9,5 @@ export interface IBlockAboutConfig { children: ChildrenType; control: ControlType; defaultEvent: boolean; + deprecated?: boolean; } diff --git a/frontend/src/app/modules/policy-engine/structures/interfaces/block-about.interface.ts b/frontend/src/app/modules/policy-engine/structures/interfaces/block-about.interface.ts index 603bd52ef8..d6447ace7d 100644 --- a/frontend/src/app/modules/policy-engine/structures/interfaces/block-about.interface.ts +++ b/frontend/src/app/modules/policy-engine/structures/interfaces/block-about.interface.ts @@ -11,4 +11,5 @@ export interface IBlockAbout { defaultEvent: boolean; prev?: IBlockAbout; next?: boolean; + deprecated?: boolean; } diff --git a/frontend/src/app/modules/policy-engine/structures/interfaces/block-dynamic-about-config.interface.ts b/frontend/src/app/modules/policy-engine/structures/interfaces/block-dynamic-about-config.interface.ts index d17bd066ac..0898109522 100644 --- a/frontend/src/app/modules/policy-engine/structures/interfaces/block-dynamic-about-config.interface.ts +++ b/frontend/src/app/modules/policy-engine/structures/interfaces/block-dynamic-about-config.interface.ts @@ -14,4 +14,5 @@ export interface IBlockDynamicAboutConfig { children?: ConfigFunction; control?: ConfigFunction; defaultEvent?: ConfigFunction; + deprecated?: ConfigFunction; } diff --git a/frontend/src/app/modules/policy-engine/structures/interfaces/block-setting.interface.ts b/frontend/src/app/modules/policy-engine/structures/interfaces/block-setting.interface.ts index 0acb72305a..3f23feb6f7 100644 --- a/frontend/src/app/modules/policy-engine/structures/interfaces/block-setting.interface.ts +++ b/frontend/src/app/modules/policy-engine/structures/interfaces/block-setting.interface.ts @@ -1,4 +1,4 @@ -import { BlockType } from "../types/block-type.type"; +import { BlockType } from "@guardian/interfaces"; import { BlockGroup } from "../types/block-group.type"; import { BlockHeaders } from "../types/block-headers.type"; import { ChildrenDisplaySettings } from "./children-display-settings.interface"; diff --git a/frontend/src/app/modules/policy-engine/structures/interfaces/children-display-settings.interface.ts b/frontend/src/app/modules/policy-engine/structures/interfaces/children-display-settings.interface.ts index 160fe745cb..a0d2c65601 100644 --- a/frontend/src/app/modules/policy-engine/structures/interfaces/children-display-settings.interface.ts +++ b/frontend/src/app/modules/policy-engine/structures/interfaces/children-display-settings.interface.ts @@ -1,6 +1,6 @@ +import { BlockType } from "@guardian/interfaces"; import { BlockGroup } from "../types/block-group.type"; import { BlockHeaders } from "../types/block-headers.type"; -import { BlockType } from "../types/block-type.type"; export interface ChildrenDisplaySettings { type: BlockType; diff --git a/frontend/src/app/modules/policy-engine/structures/policy-models/block-about.ts b/frontend/src/app/modules/policy-engine/structures/policy-models/block-about.ts index fabc5ebdbb..9d14971731 100644 --- a/frontend/src/app/modules/policy-engine/structures/policy-models/block-about.ts +++ b/frontend/src/app/modules/policy-engine/structures/policy-models/block-about.ts @@ -34,6 +34,7 @@ export class BlockAbout { this._setProp(about, dynamic, 'children'); this._setProp(about, dynamic, 'control'); this._setProp(about, dynamic, 'defaultEvent'); + this._setProp(about, dynamic, 'deprecated'); } public getAbout( @@ -48,6 +49,7 @@ export class BlockAbout { children: this._propFunc.children(this._propVal.children, block, module), control: this._propFunc.control(this._propVal.control, block, module), defaultEvent: this._propFunc.defaultEvent(this._propVal.defaultEvent, block, module), + deprecated: this._propFunc.deprecated(this._propVal.deprecated, block, module), }; } @@ -81,6 +83,9 @@ export class BlockAbout { get defaultEvent() { return this._func.defaultEvent(this._val.defaultEvent, this._block, this._module); }, + get deprecated() { + return this._func.defaultEvent(this._val.deprecated, this._block, this._module); + }, set module(value: PolicyModel | PolicyModuleModel) { this._module = value; }, diff --git a/frontend/src/app/modules/policy-engine/structures/policy-models/block.model.ts b/frontend/src/app/modules/policy-engine/structures/policy-models/block.model.ts index 194feac4fb..b6e2234f00 100644 --- a/frontend/src/app/modules/policy-engine/structures/policy-models/block.model.ts +++ b/frontend/src/app/modules/policy-engine/structures/policy-models/block.model.ts @@ -1,6 +1,6 @@ import { moveItemInArray } from '@angular/cdk/drag-drop'; import { GenerateUUIDv4, IArtifact } from '@guardian/interfaces'; -import { BlockType } from '../types/block-type.type'; +import { BlockType } from '@guardian/interfaces'; import { PolicyEventModel } from './block-event.model'; import { PolicyModel } from './policy.model'; import { IModuleVariables } from "./variables/module-variables.interface"; @@ -550,4 +550,4 @@ export class PolicyBlockModel { } return null; } -} \ No newline at end of file +} diff --git a/frontend/src/app/modules/policy-engine/structures/policy-models/policy.model.ts b/frontend/src/app/modules/policy-engine/structures/policy-models/policy.model.ts index 1b398ac6d0..cb84ffd71b 100644 --- a/frontend/src/app/modules/policy-engine/structures/policy-models/policy.model.ts +++ b/frontend/src/app/modules/policy-engine/structures/policy-models/policy.model.ts @@ -428,6 +428,19 @@ export class PolicyModel { return type; } + public setPolicyInfo(policyData: { + name: string, + description: string, + topicDescription: string + }) { + if (!policyData) { + return; + } + this.name = policyData.name; + this.description = policyData.description; + this.topicDescription = policyData.topicDescription; + } + public getJSON(): any { const json = { id: this.id, diff --git a/frontend/src/app/modules/policy-engine/structures/tree-model/block-node.ts b/frontend/src/app/modules/policy-engine/structures/tree-model/block-node.ts index 77759a5626..711763b09f 100644 --- a/frontend/src/app/modules/policy-engine/structures/tree-model/block-node.ts +++ b/frontend/src/app/modules/policy-engine/structures/tree-model/block-node.ts @@ -18,6 +18,7 @@ export class FlatBlockNode { public parentNode!: FlatBlockNode; public data!: any; public error!: boolean; + public deprecated!: boolean; constructor(node: PolicyBlockModel) { this.node = node; diff --git a/frontend/src/app/modules/policy-engine/themes/default.ts b/frontend/src/app/modules/policy-engine/themes/default.ts index 1d3de6e285..5e0a787faf 100644 --- a/frontend/src/app/modules/policy-engine/themes/default.ts +++ b/frontend/src/app/modules/policy-engine/themes/default.ts @@ -23,10 +23,12 @@ export const defaultTheme = { 'multiSignBlock', 'reportBlock', 'requestVcDocumentBlock', + 'uploadVcDocumentBlock', 'policyRolesBlock', 'interfaceStepBlock', 'tagsManager', - 'tokenConfirmationBlock' + 'tokenConfirmationBlock', + 'externalTopicBlock' ] }, { @@ -46,6 +48,7 @@ export const defaultTheme = { 'reassigningBlock', 'httpRequestBlock', 'revokeBlock', + 'revocationBlock', 'sendToGuardianBlock', 'setRelationshipsBlock', 'splitBlock', @@ -78,9 +81,3 @@ export const defaultTheme = { } ] } - - - - - - diff --git a/frontend/src/app/modules/schema-engine/document-view/document-view.component.html b/frontend/src/app/modules/schema-engine/document-view/document-view.component.html index 528ae36fcd..3efda30bd4 100644 --- a/frontend/src/app/modules/schema-engine/document-view/document-view.component.html +++ b/frontend/src/app/modules/schema-engine/document-view/document-view.component.html @@ -2,7 +2,7 @@
-
+
Id
diff --git a/frontend/src/app/modules/schema-engine/document-view/document-view.component.ts b/frontend/src/app/modules/schema-engine/document-view/document-view.component.ts index 98a75b51df..f97d835837 100644 --- a/frontend/src/app/modules/schema-engine/document-view/document-view.component.ts +++ b/frontend/src/app/modules/schema-engine/document-view/document-view.component.ts @@ -32,6 +32,10 @@ export class DocumentViewComponent implements OnInit { } ngOnInit(): void { + if(!this.document) { + return; + } + this.issuerOptions = []; this.proofJson = this.document.proof ? JSON.stringify(this.document.proof, null, 4) diff --git a/frontend/src/app/modules/schema-engine/schema-configuration/schema-configuration.component.html b/frontend/src/app/modules/schema-engine/schema-configuration/schema-configuration.component.html index 48cb859511..2daf2e30ad 100644 --- a/frontend/src/app/modules/schema-engine/schema-configuration/schema-configuration.component.html +++ b/frontend/src/app/modules/schema-engine/schema-configuration/schema-configuration.component.html @@ -7,9 +7,11 @@
- + * Policy + Draft {{policy.name}} diff --git a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.css b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.css index aa1e154bcf..835ef31bd1 100644 --- a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.css +++ b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.css @@ -237,7 +237,7 @@ form { top: 0; } -.loading-enum-values{ +.loading-enum-values { margin: 0 auto; } @@ -247,8 +247,24 @@ form { word-break: break-all; } +.page-number { + display: none; +} + +.next-page-number { + display: none; +} + +.delimiter-to-next-page { + display: none; +} + +.page-btns { + display: none; +} + @media (max-width: 810px) { - + .invalid-field-label { position: relative; left: 30px; @@ -271,21 +287,12 @@ form { display: none; } - .form-field-array-item > .form-field-group { - padding-left: 0; - margin-bottom: 0; - } - - .form-dialog .form-field-group { - margin-bottom: 0; - } - .label-field .page-number { + display: block; font-size: 18px; padding: 4px 10px; margin-right: 8px; display: inline-block; - background: #2C78F6; color: white; border-radius: 100px; @@ -299,8 +306,8 @@ form { } .label-field .delimiter-to-next-page { + display: block; height: 0px; - border: 1px solid #BABABA; flex-grow: 1; display: inline-block; @@ -308,36 +315,35 @@ form { } .label-field .next-page-number { + display: block; font-size: 18px; padding: 4px 10px; display: inline-block; - background: #2C78F6; opacity: 0.3; color: white; border-radius: 100px; } - .form-field-group { - margin-bottom: 100px; - } - .page-btns { - width: 90%; + display: block; + width: calc(100% - 36px); display: grid; grid-template-columns: 1fr 1fr; column-gap: 10px; margin-top: 20px; - + background-color: white; padding: 20px 0; position: fixed; bottom: 0; left: 50%; transform: translateX(-50%); + z-index: 200; } - #cancel-btn, #previous-btn { + #cancel-btn, + #previous-btn { border: 1px solid #2C78F6; background: none !important; color: #2C78F6; @@ -357,4 +363,35 @@ form { .page-btns-last-page #previous-btn { width: calc(100% - 5px); } + + *[showMobileField="true"] { + display: flex !important; + } + + *[showMobileField="false"] { + display: none !important; + } + + .form-field-group { + padding-left: 0 !important; + } + + .schema-form-field-array-group>.form-field-array-item, + .form-field-array-item>.schema-form-field-group { + padding-left: 10px !important; + } + + form[childSchema="false"][showButtons="true"] { + padding-bottom: 100px; + } + + .short-delimiter-container .delimiter { + display: block; + padding: 20px 10px 20px 10px; + height: 45px; + } + + .short-delimiter-container .delimiter::after { + top: 20px; + } } \ No newline at end of file diff --git a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.html b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.html index 0fec318fd8..3ba11887d9 100644 --- a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.html +++ b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.html @@ -1,14 +1,13 @@ -
+ - -
- +
+
arrow_circle_right - {{GetInvalidMessageByFieldType(item)}} + {{getInvalidMessageByFieldType(item)}}
* Required
@@ -23,7 +22,7 @@ - +
@@ -42,7 +41,7 @@ + [placeholder]="getPlaceholderByFieldType(item)">
{{item.unit}}
- -
- - - - -
-
- -
+ + +
arrow_circle_right @@ -102,10 +94,10 @@
* Required
-
{{i + 1}}/{{fields.length}}
- {{item.description}} -
-
{{i + 2}}
+
{{i + 1}}/{{fields.length}}
+ {{item.description}} +
+
{{i + 2}}
@@ -114,8 +106,8 @@ [disabled]="item.control?.disabled"> + [context]="item.context" [private-fields]="hide" [delimiter-hide]="true" + [conditions]="item.conditions" [preset]="item.preset" [isChildSchema]="true">
@@ -131,27 +123,22 @@ remove Remove Entity
-
- - - - -
- + +
arrow_circle_right - {{GetInvalidMessageByFieldType(item)}} + {{getInvalidMessageByFieldType(item)}}
* Required
-
{{i}}/{{fields.length - 1}}
- {{item.description}} -
-
{{i + 1}}
+
{{i}}/{{fields.length - 1}}
+ {{item.description}} +
+
{{i + 1}}
@@ -162,7 +149,7 @@ + [placeholder]="getPlaceholderByFieldType(item)">
+ [placeholder]="getPlaceholderByFieldType(item)">
- -
+ + +
arrow_circle_right @@ -247,10 +235,10 @@
* Required
-
{{i}}/{{fields.length - 1}}
- {{item.description}} -
-
{{i + 1}}
+
{{i}}/{{fields.length - 1}}
+ {{item.description}} +
+
{{i + 1}}
@@ -261,7 +249,7 @@ + [conditions]="item.conditions" [preset]="listItem.preset" [isChildSchema]="true"> @@ -280,13 +268,7 @@ add Add Entity
-
- - - -
-
@@ -297,16 +279,29 @@ *ngIf="condition.ifCondition.fieldValue === options.controls[item.name]?.value; else elseCondition" [fields]="condition.thenFields" [formGroup]="condition.conditionForm" [preset]="condition.preset" [readonly-fields]="readonly" - (destroy)="removeConditionFields(condition.thenFields, condition)"> + (destroy)="removeConditionFields(condition.thenFields, condition)" + [isChildSchema]="true"> + (destroy)="removeConditionFields(condition.elseFields, condition)" + [isChildSchema]="true">
+ +
+ + + + +
\ No newline at end of file diff --git a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.ts b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.ts index d85c72a0b7..dbefb092ef 100644 --- a/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.ts +++ b/frontend/src/app/modules/schema-engine/schema-form/schema-form.component.ts @@ -2,9 +2,7 @@ import { NgxMatDateAdapter, NGX_MAT_DATE_FORMATS } from '@angular-material-compo import { NgxMatMomentAdapter } from '@angular-material-components/moment-adapter'; import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; import { AbstractControl, FormArray, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { GoogleMap } from '@angular/google-maps'; -import { Schema, SchemaCondition, SchemaField, UnitSystem } from '@guardian/interfaces'; +import { GenerateUUIDv4, Schema, SchemaField, UnitSystem } from '@guardian/interfaces'; import { fullFormats } from 'ajv-formats/dist/formats'; import * as moment from 'moment'; import { Subject } from 'rxjs'; @@ -77,35 +75,28 @@ export class SchemaFormComponent implements OnInit { @Input('readonly-fields') readonly?: any; @Input('schema') schema!: Schema; @Input('fields') schemaFields!: SchemaField[]; - @Input('context') context!: { - type: any; - context: any; - }; + @Input('context') context!: { type: any; context: any }; @Input('formGroup') group!: FormGroup; @Input('delimiter-hide') delimiterHide: boolean = false; @Input('conditions') conditions: any = null; @Input('preset') presetDocument: any = null; + @Input() cancelText: string = 'Cancel'; + @Input() submitText: string = 'Submit'; + @Input() cancelHidden: boolean = false; + @Input() submitHidden: boolean = false; + @Input() showButtons: boolean = true; + @Input() isChildSchema: boolean = false; + @Input() comesFromDialog: boolean = false; @Output('change') change = new EventEmitter(); @Output('destroy') destroy = new EventEmitter(); - - destroy$: Subject = new Subject(); - options: FormGroup | undefined; - fields: any[] | undefined = []; - conditionFields: SchemaField[] = []; - - @Input() cancelHidden: boolean = true; - @Input('disableSubmitBtn') disableSubmitBtn: boolean = false; @Output() cancelBtnEvent = new EventEmitter(); @Output() submitBtnEvent = new EventEmitter(); - @Input() showChildSchemaForm: boolean = false; - @Input() buttonOnceRaised: boolean = false; - @Input() showButtons: boolean = true; - @Input() comesFromDialog: boolean = false; - - public innerWidth: any; - public innerHeight: any; + public destroy$: Subject = new Subject(); + public options: FormGroup | undefined; + public fields: any[] | undefined = []; + public conditionFields: SchemaField[] = []; public isShown: boolean[] = [true, true]; public currentIndex: number = 0; @@ -116,24 +107,11 @@ export class SchemaFormComponent implements OnInit { constructor( private ipfs: IPFSService, - protected changeDetectorRef: ChangeDetectorRef, - private router: Router + protected changeDetectorRef: ChangeDetectorRef ) { } ngOnInit(): void { - this.innerWidth = window.innerWidth; - this.innerHeight = window.innerHeight; - - if (this.fields) { - for (let i = 0; i < this.fields.length; i++) { - if (this.fields[i].isRef) { - this.isShown[i] = true; - break; - } - this.isShown[i] = true; - } - } } ngOnChanges() { @@ -182,7 +160,13 @@ export class SchemaFormComponent implements OnInit { this.update(schemaFields); } - update(schemaFields?: SchemaField[]) { + ngOnDestroy() { + this.destroy.emit(); + this.destroy$.next(true); + this.destroy$.unsubscribe(); + } + + private update(schemaFields?: SchemaField[]) { if (!schemaFields) { return; } @@ -217,6 +201,16 @@ export class SchemaFormComponent implements OnInit { this.options.addControl("@context", new FormControl(this.context.context)); } + if (this.fields) { + for (let i = 0; i < this.fields.length; i++) { + if (this.fields[i].isRef) { + this.isShown[i] = true; + break; + } + this.isShown[i] = true; + } + } + this.options?.updateValueAndValidity(); this.changeDetectorRef.detectChanges(); } @@ -224,7 +218,8 @@ export class SchemaFormComponent implements OnInit { private createFieldControl(field: SchemaField): any { const item: any = { ...field, - hide: false + hide: false, + id: GenerateUUIDv4() } if (this.presetDocument) { @@ -452,7 +447,7 @@ export class SchemaFormComponent implements OnInit { }); } - addItem(item: any) { + public addItem(item: any) { const listItem = this.createListControl(item); item.list.push(listItem); setTimeout(() => { @@ -462,7 +457,7 @@ export class SchemaFormComponent implements OnInit { }); } - addGroup(item: any) { + public addGroup(item: any) { item.control = item.customType === 'geo' ? new FormControl({}) : new FormGroup({}); this.options?.addControl(item.name, item.control); @@ -470,14 +465,14 @@ export class SchemaFormComponent implements OnInit { this.changeDetectorRef.detectChanges(); } - removeGroup(item: any) { + public removeGroup(item: any) { this.options?.removeControl(item.name); this.options?.updateValueAndValidity(); item.control = null; this.change.emit(); } - removeItem(item: any, listItem: any) { + public removeItem(item: any, listItem: any) { const index = item.list.indexOf(listItem); item.control.removeAt(index); item.list.splice(index, 1); @@ -490,7 +485,7 @@ export class SchemaFormComponent implements OnInit { } - onFileSelected(event: any, control: AbstractControl, item: any) { + public onFileSelected(event: any, control: AbstractControl, item: any) { control.patchValue(""); const file = event?.target?.files[0]; @@ -511,7 +506,7 @@ export class SchemaFormComponent implements OnInit { }); } - GetInvalidMessageByFieldType(item: SchemaField): string { + public getInvalidMessageByFieldType(item: SchemaField): string { const type = item.format || item.type; const messages = item.isArray ? ErrorArrayMessageByFieldType @@ -538,11 +533,11 @@ export class SchemaFormComponent implements OnInit { } } - GetPlaceholderByFieldType(item: SchemaField): string { + public getPlaceholderByFieldType(item: SchemaField): string { const type = item.format || item.type; const pattern = item.pattern; const customType = item.customType; - if(customType) { + if (customType) { switch (customType) { case 'hederaAccount': return PlaceholderByFieldType.HederaAccount; @@ -587,7 +582,7 @@ export class SchemaFormComponent implements OnInit { }; } - getConditions(field: any) { + public getConditions(field: any) { if (!this.conditions) { return []; } @@ -596,7 +591,7 @@ export class SchemaFormComponent implements OnInit { } } - removeConditionFields(fields: SchemaField[], condition: any) { + public removeConditionFields(fields: SchemaField[], condition: any) { condition.conditionForm = new FormGroup({}); this.subscribeCondition(condition.conditionForm); fields.forEach(item => { @@ -629,39 +624,32 @@ export class SchemaFormComponent implements OnInit { }); } - - ngOnDestroy() { - this.destroy.emit(); - this.destroy$.next(true); - this.destroy$.unsubscribe(); - } - - isHelpText(item: SchemaField): boolean { + public isHelpText(item: SchemaField): boolean { return item.type === 'null'; } - isTime(item: SchemaField): boolean { + public isTime(item: SchemaField): boolean { return item.type === 'string' && item.format === 'time'; } - isDate(item: SchemaField): boolean { + public isDate(item: SchemaField): boolean { return item.type === 'string' && item.format === 'date'; } - isDateTime(item: SchemaField): boolean { + public isDateTime(item: SchemaField): boolean { return item.type === 'string' && item.format === 'date-time'; } - isBoolean(item: SchemaField): boolean { + public isBoolean(item: SchemaField): boolean { return item.type === 'boolean'; } - isIPFS(item: SchemaField): boolean { + public isIPFS(item: SchemaField): boolean { return item.pattern === '^((https):\/\/)?ipfs.io\/ipfs\/.+' || item.pattern === '^ipfs:\/\/.+'; } - isInput(item: SchemaField): boolean { + public isInput(item: SchemaField): boolean { return ( ( item.type === 'string' || @@ -676,21 +664,19 @@ export class SchemaFormComponent implements OnInit { ); } - isEnum(item: SchemaField) { + public isEnum(item: SchemaField) { return item.remoteLink || item.enum; } - isPrefix(item: SchemaField): boolean { + public isPrefix(item: SchemaField): boolean { return item.unitSystem === UnitSystem.Prefix; } - isPostfix(item: SchemaField): boolean { + public isPostfix(item: SchemaField): boolean { return item.unitSystem === UnitSystem.Postfix; } - - - getNextShownFields(fields: SchemaField[]): boolean[] { + public getNextShownFields(fields: SchemaField[]): boolean[] { this.isShown = new Array(fields.length).fill(false); let nextRefIndex = -1; let initialDivision = 0; @@ -738,7 +724,7 @@ export class SchemaFormComponent implements OnInit { return this.isShown; } - getPrevShownFields(fields: SchemaField[]): boolean[] { + public getPrevShownFields(fields: SchemaField[]): boolean[] { this.isShown = new Array(fields.length).fill(false); let prevRefIndex = -1; if (this.currentIndex === 0) { @@ -790,30 +776,20 @@ export class SchemaFormComponent implements OnInit { behavior: 'smooth' }); }, 100) - - - return this.isShown; - } - - - - - navigatePolicyViewer() { - this.router.navigate(['/policy-viewer']); + return this.isShown; } - closeWindow() { + public closeWindow() { window.close(); } - onCancelBtnClick() { - this.cancelBtnEvent.emit(false); // PENSO QUE ISTO FOI O QUE O FILIPE ME AJUDOU A FAZER - this.navigatePolicyViewer(); + public onCancelBtnClick() { + this.cancelBtnEvent.emit(false); } - onSubmitBtnClick(fields: any) { + public onSubmitBtnClick(fields: any) { this.submitBtnEvent.emit(fields); } } \ No newline at end of file diff --git a/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.css b/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.css index b89ee2e424..2a8175e7d6 100644 --- a/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.css +++ b/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.css @@ -8,13 +8,14 @@ margin-bottom: 8px; font-family: monospace; cursor: text; - height: 640px; + height: 630px; width: 780px; overflow: auto; border: 1px solid #eee; border-radius: 4px; padding: 10px; box-sizing: border-box; + margin-top: 10px; } .content { @@ -26,6 +27,7 @@ .dialog-content { overflow: hidden; + width: 100%; } .view-toggle { diff --git a/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.ts b/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.ts index 80ca0a0a79..a791727b0c 100644 --- a/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.ts +++ b/frontend/src/app/modules/schema-engine/vc-dialog/vc-dialog.component.ts @@ -41,10 +41,14 @@ export class VCViewerDialog { toggle } = this.data; this.title = title; - this.json = JSON.stringify((document), null, 4); + this.json = document ? JSON.stringify((document), null, 4) : ''; this.document = document; this.type = type || 'JSON'; this.toggle = toggle !== false; + if(!this.document) { + this.type = 'JSON'; + this.toggle = false; + } this.isVcDocument = false; this.isVpDocument = false; diff --git a/frontend/src/app/modules/tag-engine/tags-create-dialog/tags-create-dialog.component.html b/frontend/src/app/modules/tag-engine/tags-create-dialog/tags-create-dialog.component.html index c396009960..e2a7260812 100644 --- a/frontend/src/app/modules/tag-engine/tags-create-dialog/tags-create-dialog.component.html +++ b/frontend/src/app/modules/tag-engine/tags-create-dialog/tags-create-dialog.component.html @@ -60,7 +60,7 @@ delete
- +
diff --git a/frontend/src/app/services/web-socket.service.ts b/frontend/src/app/services/web-socket.service.ts index 1951b63d19..042c11f634 100644 --- a/frontend/src/app/services/web-socket.service.ts +++ b/frontend/src/app/services/web-socket.service.ts @@ -180,7 +180,8 @@ export class WebSocketService { case MessageAPI.GET_STATUS: case MessageAPI.UPDATE_STATUS: this.updateStatus(event.data); - const allStatesReady = !this.serviesStates.find((item: any) => !item.states.includes(ApplicationStates.READY)); + // const allStatesReady = !this.serviesStates.find((item: any) => !item.states.includes(ApplicationStates.READY)); + const allStatesReady = true; if (!allStatesReady) { if (!['/status', '/admin/settings', '/admin/logs'].includes(location.pathname)) { const last = location.pathname === '/status' ? null : btoa(location.href); diff --git a/frontend/src/app/views/header/header.component.css b/frontend/src/app/views/header/header.component.css index aecd7f4625..a97c031b26 100644 --- a/frontend/src/app/views/header/header.component.css +++ b/frontend/src/app/views/header/header.component.css @@ -450,219 +450,6 @@ a[hidden="true"] { } - /* Menu Footer */ - - .footer { - display: none; - position: fixed; - left: 0; - bottom: 0; - width: 90%; - - color: #fff; - z-index: 5000; - transition: 0.8s; - } - - .logout { - margin: 8px 8px 40px 32px; - color: #222222; - line-height: 23px; - font-weight: normal; - text-decoration: none; - font-size: 20px; - display: block; - transition: 0.2s; - text-align: left; - } - - .logout .material-icons { - position: relative; - bottom: -5px; - left: 100px; - } - - .user-info { - padding: 8px 8px 15px 32px; - font-size: 14px; - border-top: 2px solid var(--primary-color); - width: 100%; - transition: max-height 0.2s ease-in-out; - } - - .name { - display: flex; - align-items: center; - width: 100%; - position: relative; - margin-top: -25px; - } - - .name .user-name { - display: inline-block; - color: var(--primary-color); - padding: 0 8px; - margin-bottom: 10px; - margin-left: -8px; - background-color: white; - font-size: 20px; - transition: 0.8s; - } - - .profile-item { - color: #aaaaaa; - display: grid; - grid-template-columns: 80px auto; - column-gap: 5px; - } - - .profile-item .profile-item-name { - display: inline; - } - - .profile-item .profile-item-value { - display: inline; - } - -} - -.mobile-menu-button { - display: none; - flex-direction: column; - justify-content: space-between; - width: 30px; - height: 20px; -} - -.mobile-menu-button .bar { - height: 3px; - width: 100%; - background-color: white; - border-radius: 10px; -} - -#menu-backdrop { - display: none; -} - -@media (max-width: 810px) { - - /* - .content { - position: fixed; - top: 0; - width: 100vw; - } - */ - - .mobile-header { - width: 100%; - height: 100%; - display: flex; - } - - .mobile-menu-button { - display: flex; - margin: 29px 0 23px 32px; - } - - .user-content-info { - display: flex; - margin-left: 22px; - margin-right: 22px; - flex: auto; - gap: 22px; - } - - .user-balance { - border-radius: 5px; - height: 38px; - font-size: 15px; - line-height: 1.2; - text-align: center; - white-space: normal; - display: flex; - align-items: center; - justify-content: center; - } - - - /* Hamburguer Menu */ - - .nav-list { - padding-top: 20px; - } - - .nav-items { - height: 100%; - width: 0; - position: fixed; - z-index: 5000; - top: 0; - left: 0; - background-color: white; - overflow-x: hidden; - transition: 0.2s; - } - - .nav-items .nav-list-item { - padding: 8px 8px 8px 32px; - text-decoration: none; - font-size: 25px; - color: #222222; - display: block; - transition: 0.05s; - text-align: left; - } - - .nav-items .nav-list-item:hover { - color: #818181; - } - - .nav-list-item[active="true"] { - color: var(--primary-color) !important; - transition: 0.05s; - } - - .nav-items .material-icons { - margin: 23px auto 23px 32px; - font-size: 36px; - color: #222222; - } - - #menu-backdrop { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100vh; - z-index: 1; - background-color: rgba(0, 0, 0, 0.75); - } - - .subnav-list { - border-left: 3px #e3e3e3 solid; - max-height: 0; - overflow: hidden; - transition: max-height 0.2s ease-in-out; - } - - .nav-list-item[active="true"] .subnav-list { - overflow: visible; - } - - .subnav-list .nav-list-item { - font-size: 20px; - padding: 8px 20px; - height: auto; - } - - .subnav-list .nav-list-item[active="true"] { - margin-left: -3.5px; - border-left: 4px var(--primary-color) solid; - } - - /* Menu Footer */ .footer { diff --git a/frontend/src/app/views/header/header.component.html b/frontend/src/app/views/header/header.component.html index 08704368c2..14fb2f20a4 100644 --- a/frontend/src/app/views/header/header.component.html +++ b/frontend/src/app/views/header/header.component.html @@ -11,24 +11,24 @@ + - - +
+
+ + @@ -242,7 +233,7 @@ -
+
@@ -254,16 +245,16 @@ + - @@ -305,7 +296,7 @@ - +