diff --git a/.github/workflows/asw2122.yml b/.github/workflows/asw2122.yml
index c29c702..faf14e1 100644
--- a/.github/workflows/asw2122.yml
+++ b/.github/workflows/asw2122.yml
@@ -39,12 +39,23 @@ jobs:
- uses: actions/setup-node@v2
with:
node-version: 16
+ - name: Create env
+ run: |
+ cd restapi
+ touch .env
+ echo DATABASE_USER=${{ secrets.DATABASE_USER }} >> .env
+ echo DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }} >> .env
+ echo DATABASE_NAME=${{ secrets.DATABASE_NAME }} >> .env
+ echo JWT_TOKEN=${{ secrets.JWT_TOKEN }} >> .env
+ cat .env
- run: npm --prefix webapp install
- run: npm --prefix restapi install
- run: npm --prefix webapp run build
- run: npm --prefix webapp run test:e2e
docker-push-webapp:
name: Push webapp Docker Image to GitHub Packages
+ env:
+ REACT_APP_API_URI: http://${{ secrets.DEPLOY_HOST }}:5000
runs-on: ubuntu-latest
needs: [e2e-tests]
steps:
@@ -57,8 +68,14 @@ jobs:
password: ${{ secrets.DOCKER_PUSH_TOKEN }}
registry: ghcr.io
workdir: webapp
+ buildargs: REACT_APP_API_URI
docker-push-restapi:
name: Push restapi Docker Image to GitHub Packages
+ env:
+ DATABASE_USER: ${{ secrets.DB_USER }}
+ DATABASE_PASSWORD: ${{ secrets.DB_PASSWORD }}
+ DATABASE_NAME: ${{ secrets.DB_NAME }}
+ JWT_TOKEN: ${{ secrets.TOKEN }}
runs-on: ubuntu-latest
needs: [e2e-tests]
steps:
@@ -71,3 +88,21 @@ jobs:
password: ${{ secrets.DOCKER_PUSH_TOKEN }}
registry: ghcr.io
workdir: restapi
+ buildargs: DATABASE_USER,DATABASE_PASSWORD,DATABASE_NAME,JWT_TOKEN
+ deploy:
+ name: Deploy over SSH
+ runs-on: ubuntu-latest
+ needs: [docker-push-restapi,docker-push-webapp]
+ steps:
+ - name: Deploy over SSH
+ uses: fifsky/ssh-action@master
+ with:
+ host: ${{ secrets.DEPLOY_HOST }}
+ user: ${{ secrets.DEPLOY_USER }}
+ key: ${{ secrets.DEPLOY_KEY }}
+ command: |
+ wget https://raw.githubusercontent.com/Arquisoft/dede_es2c/Dario-Nueva/docker-compose-deploy.yaml -O docker-compose.yml
+ docker-compose stop
+ docker-compose rm -f
+ docker-compose pull
+ docker-compose up -d
\ No newline at end of file
diff --git a/README.md b/README.md
index 4f504b6..3a9ee16 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
# dede_es2c
-[![Actions Status](https://github.com/arquisoft/dede_0/workflows/CI%20for%20ASW2122/badge.svg)](https://github.com/arquisoft/dede_0/actions)
-[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_dede_0&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Arquisoft_dede_0)
-[![codecov](https://codecov.io/gh/arquisoft/dede_0/branch/master/graph/badge.svg?token=VN4XG9NTRO)](https://codecov.io/gh/pglez82/asw2122_0)
+[![Actions Status](https://github.com/Arquisoft/dede_es2c/actions/workflows/asw2122.yml/badge.svg)](https://github.com/Arquisoft/dede_es2c/actions/workflows/asw2122.yml)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_dede_es2c&metric=alert_status)](https://sonarcloud.io/summary/overall?id=Arquisoft_dede_es2c)
+[![codecov](https://codecov.io/gh/arquisoft/dede_0/branch/master/graph/badge.svg?token=VN4XG9NTRO)](https://app.codecov.io/gh/Arquisoft/dede_es2c)
diff --git a/README_es.md b/README_es.md
index 9ff3b0c..979354c 100644
--- a/README_es.md
+++ b/README_es.md
@@ -1,8 +1,8 @@
# asw2122_0
-[![Actions Status](https://github.com/pglez82/asw2122_0/workflows/CI%20for%20ASW2122/badge.svg)](https://github.com/pglez82/asw2122_0/actions)
-[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=pglez82_asw2122_0&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=pglez82_asw2122_0)
-[![codecov](https://codecov.io/gh/pglez82/asw2122_0/branch/master/graph/badge.svg?token=VN4XG9NTRO)](https://codecov.io/gh/pglez82/asw2122_0)
+[![Actions Status](https://github.com/Arquisoft/dede_es2c/actions/workflows/asw2122.yml/badge.svg)](https://github.com/Arquisoft/dede_es2c/actions/workflows/asw2122.yml)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_dede_es2c&metric=alert_status)](https://sonarcloud.io/summary/overall?id=Arquisoft_dede_es2c)
+[![codecov](https://codecov.io/gh/arquisoft/dede_0/branch/master/graph/badge.svg?token=VN4XG9NTRO)](https://app.codecov.io/gh/Arquisoft/dede_es2c)
diff --git a/docker-compose-deploy.yaml b/docker-compose-deploy.yaml
new file mode 100644
index 0000000..27119de
--- /dev/null
+++ b/docker-compose-deploy.yaml
@@ -0,0 +1,12 @@
+version: '3.5'
+services:
+ restapi:
+ image: ghcr.io/arquisoft/dede_es2c/restapi:latest
+ ports:
+ - "5000:5000"
+ webapp:
+ image: ghcr.io/arquisoft/dede_es2c/webapp:latest
+ ports:
+ - "3000:3000"
+ depends_on:
+ - restapi
\ No newline at end of file
diff --git a/docker-compose-deploy.yml b/docker-compose-deploy.yml
deleted file mode 100644
index 83b68b8..0000000
--- a/docker-compose-deploy.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: "3.5"
-services:
- restapi:
- build: ./restapi
- ports:
- - "5000:5000"
- webapp:
- build: ./webapp
- ports:
- - "3000:3000"
- depends_on:
- - restapi
\ No newline at end of file
diff --git a/docs/01_introduction_and_goals.adoc b/docs/01_introduction_and_goals.adoc
index d13c8cb..ac86178 100644
--- a/docs/01_introduction_and_goals.adoc
+++ b/docs/01_introduction_and_goals.adoc
@@ -6,10 +6,12 @@ Estará centrada en la venta de productos informáticos de diferentes ámbitos (
Este sistema busca priorizar la privacidad de los clientes a través de los principios SOLID.
El sistema obtendrá la información de los clientes de los pods de los usuarios siempre que éstos den los permisos necesarios al sistema de venta.
Se distinguirá entre usuarios normales y adminstradores. Éstos pueden, además de acceder a la tienda, crear, modificar y eliminar los productos de la base de datos.
+Los usuarios eligirán los productos que formarán parte de su carro de compra. Cada usuario tiene su propio carro individual.
=== Información general de los requisitos
+A continuación se muestran los requisitos que se puedes encontrar en nuestra aplicación. Se dividen en obligatorios y opcionales
.Requisitos obligatorios
@@ -22,18 +24,9 @@ Se distinguirá entre usuarios normales y adminstradores. Éstos pueden, además
.Requisitos opcionales
-* Los usuarios pueden tener más de una dirección de envío en sus pods (por ejemplo, en sus casas, universidad, …)
-* Poner una estimación del tiempo en que la persona estará en un sitio y limitar algunas direcciones de ser usadas en la entrega fuera de esos horarios.
-* Crear estaciones de recogida que algunos portadores emplearán. La estación de recogida se puede calcular de forma dinámica basándose en la dirección de la persona o en una posición que pille de camino al receptor.
-* Se pueden usar APIs externas de diferentes portadores, para que los usuarios puedan establecer con cuál de los portadores desean realizar el pedido.
-* Hacer que algunos usuarios con privilegios de administrador puedan ver estadísticas de productos solicitados y monitorizar el estado de los pedidos.
-* Realizar el producto tanto en una aplicación web como una aplicación de móvil.
-* Crear un emulador del sistema de envío que pueda notificar a los usuarios cuando los productos hayan llegado a su destino y poder seguir el proceso de envío.
-* Tener diferentes roles como clientes o gestores que puedan realizar diferentes acciones como gestión de inventario, cambios de precios, quitar ítems del catálogo, etc.
-* Incluir la posibilidad de que haya varios centros de distribución o almacenes en los que se encuentren almacenados los productos.
-* Que los usuarios puedan añadir o actualizar la información de sus direcciones en sus pods a través de la aplicación.
-* Permitir a los usuarios dar realimentación sobre su experiencia como puntuaciones y revisiones a los productos o los centros de distribución.
-* Se deja abierta la opción de emplear más de una tecnología de despliegue.
+* Rol de gestores que puedan realizar diferentes acciones como gestión de inventario, cambios de precios, quitar ítems del catálogo, etc.
+* Se añade tambien una vista en el que el administrador pueda ver todos los pedidos que se han realizado.
+* Un usuario puedde actuzalziar el nombre de este dentro de la aplicación
=== Objetivos de calidad
@@ -46,6 +39,7 @@ Se distinguirá entre usuarios normales y adminstradores. Éstos pueden, además
| Seguridad | El usuario debe tener la certeza de que su información personal esté segura para ganar su confianza | Alta
| Robustez | Se ha de manejar correctamente las excepciones para evitar que el usuario tenga una experiencia desagradable usando la aplicación | Alta
| Privacidad | Solamente el usuario debería tener acceso a su información privada, sin que haya terceras partes implicadas | Alta
+| Transparencia | Todo lo que se haga en el proyecto permanecerá en un repositorio público para que otra gente lo pueda tener como referencia | Media
| Comodidad | La aplicación ha de ser fácil de manejar para gente no experimentada | Alta
|===
@@ -57,8 +51,9 @@ Se distinguirá entre usuarios normales y adminstradores. Éstos pueden, además
|Rol/Nombre|Expectations
| Equipo de desarrollo | Aprender a trabajar en equipo con gente que no conocen y familiarizarse con las tecnologías solicitadas en el curso
| Empresa de venta de productos (cliente) | Una aplicación funcional que satisfaga los requisitos solicitados, especialmente aquellos relacionados con la seguridad
-| Cliente | Poder entrar a la aplicación para realizar las compras que desean de forma segura y cómoda
+| Cliente | Poder entrar a la aplicación para realizar las compras que desean de forma segura y cómoda. Introducirán sus productos en un carro de la compra.
| Administrador | Tener el control de una aplicación robusta y eficiente que incluya la posiblidad de crear, modificar, eliminar productos, ver los usuarios y pedidos
+| Inrupt/Empathy | Entidades colaboradoras del concurso SOLID en el que se puede presentar el proyecto desarrollado durante el curso
|===
diff --git a/docs/02_architecture_constraints.adoc b/docs/02_architecture_constraints.adoc
index affb8b3..a77e5c0 100644
--- a/docs/02_architecture_constraints.adoc
+++ b/docs/02_architecture_constraints.adoc
@@ -7,7 +7,6 @@
| Restricción | Descripción
| Typescript | Nuevo lenguaje de programación para todos los integrantes del grupo.
| React | Libreria JavaScript requerido para construir interfaces de usuario para la web. Aplicación nueva que nunca usamos.
-| Mongo | Se trata de una base de datos no relacional, la primera vez que trabajamos con una.
| SOLID | Principios y tecnologia que nos ayudará a organizar apps, al igual que react, tenemos que investigar sobre ello ya que es la primera vez que la usamos.
|===
diff --git a/docs/08_concepts.adoc b/docs/08_concepts.adoc
index f656d1e..12e63c1 100644
--- a/docs/08_concepts.adoc
+++ b/docs/08_concepts.adoc
@@ -3,8 +3,55 @@
=== Modelo de dominio
-image:08_Modelo_datos.png["Modelo de datos"]
-
+----
+object Product{
+ codigo: String
+ categoria: String
+ nombre: String
+ precio: Number
+ descripcion: String
+ stock: Number
+ url: String
+}
+
+
+object User{
+ name : String
+ surname: String
+ email : String
+ role : String
+ password: String
+}
+
+object Order{
+ codigo: String
+ correo: String
+ direccion: String
+ fecha: Date
+ precio Total: Number
+ products: Array
+}
+
+
+object Cart{
+ client_id: ObjectId
+ products: Array
+
+}
+
+object Review{
+ score: Number
+ comment: String
+ authorEmail: String
+ productCode: String
+}
+
+User *--> Cart
+Cart *--> Order
+User *--> Review
+Order o--> Product
+Product *--> Review
+----
=== Internacionalización
La aplicación soportará el lenguaje español. En función del éxito que tenga el proyecto, puede que se plantee en un futuro incluir otros idiomas como inglés o francés.
@@ -25,7 +72,7 @@ Se incluirá el código necesario para manejar y capturar los errores procedente
Se seguirán unas convenciones mínimas de accesibilidad. En concreto, garantizamos que nuestra aplicación no tendrá combinación de colores que resulten dañinas a personas que sean daltónicas.
=== Manejo de sesión
-Se manejarán las sesiones a través del uso de las APIs necesarias.
+Se manejarán las sesiones a través del uso de tokens asignados a cada usuario registrado.
=== Estándares de código
El crear código limpio que siga unas estructuras y patrones definidos es base fundamental para crear código que se pueda actualizar en un futuro. Queremos garantizar crear una aplicación al nivel que se puede esperar de un equipo de formado por Ingenieros Informáticos del Software.
@@ -36,6 +83,9 @@ Uso de una base de datos MongoDB para gestionar la parte de almacenamiento y mod
=== Prototipado de la aplicación
El formato que se ha escogido para realizar los prototipos de la aplicacion es que esta sea fácil de usar y a la vez siga la forma del resto de aplicaciones del mismo tipo de esta.
+=== Generación de pruebas
+Consideramos fundamental el uso de pruebas unitarias para verificar el correcto funcionamiento de la aplicación.
+
Para comenzar tenemos la página inicial, esta estara compuesta por aquellos productos que tengan un descuento o sean top ventas de la aplicación.
image:08_HomePage.png["Página inicio"]
diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc
index b740629..a787b64 100644
--- a/docs/09_design_decisions.adoc
+++ b/docs/09_design_decisions.adoc
@@ -24,10 +24,13 @@ Las siguientes decisiones de diseño tomadas por el equipo de desarrollo, van or
| _Mongoose_ | _Facilita la conexion con la base de datos_ | _Nunca ha sido utilizado_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #08]
| _Express_ | _Facilita el diseño la aplicación de forma sencilla y rápida_ | _Primera vez que se ha trabajado_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #09]
| _NodeJS_| _Failita el trbajo a la hora de pedir datos a la base de datos_ | _Es necesario aprender como funciona este sistema_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #10]
+| _AWS_ | _Despliegue de la aplicación web en nube_| _Se necesita de una cuenta especifica y ademas ,poco conocimeiento sobre este_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #11]
+| _EasyPost_ | _Calculo de envio para la aplicación sencillo_ | _Puede producir errores, centro de distribución se situa en EEUU_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #12]
+| _JSON Web Token_ | _Guarda de forma correcta el usuario para controlar sus privilegios_ | _Puede generar fallos de seguridad_ | https://github.com/Arquisoft/dede_es2c/wiki/00:-Decisiones-Arquitect%C3%B3nicas[DA #13]
|===
-Decisiones que todavia no se han llegado a decidir
+Decisiones Denegadas
[options="header",cols="1,2,2,2"]
|===
| Decisiones | Ventajas | Desventajas | Link
diff --git a/docs/11_technical_risks.adoc b/docs/11_technical_risks.adoc
index 0c5a879..756d99b 100644
--- a/docs/11_technical_risks.adoc
+++ b/docs/11_technical_risks.adoc
@@ -4,10 +4,11 @@
.Riesgos Técnicos
* Falta de experiencia con las tecnologías, ya sea React, TypeScript o SOLID. Nunca hemos trabajado con estas tecnologías, por lo tanto, empezaremos desde cero y deberíamos realizar búsquedas de información constantes para conseguir manejarlas correctamente.
+Para solucionarlo hemos buscado información del campo que nos ha sido asignado cada uno y hemos hecho pruebas de funcionalidad para paliar los máximos errores posibles.
* Posibles problemas al trabajar con GitHub. Pueden surgir problemas a la hora de subir nuestros cambios a GitHub e incluso modificar cambios ya realizados por otros compañeros, para reducir esto lo máximo posible, cada compañero trabajará en su rama y cuando se quiera realizar cambios al proyecto principal se hará un pull request para que otro miembro del equipo lo verifique.
* Primer proyecto web con un tamaño tan grande. Si bien hemos tenido algo de experiencia con proyectos web, nunca con estas dimensiones ni tecnologías. Para paliar este riesgo, deberíamos buscar bastante información sobre cómo llevarlo a cabo e intentar familiarizarnos con esta forma de trabajo lo antes posible.
* El tiempo. Tenemos poco tiempo para llevar a cabo los prototipos, entonces habrá que tenerlo en cuenta a la hora de desarrollar y llevar el proyecto lo más al día posible.
-* Posibles vulnerabilidades en el proyecto web. Nunca nos han hablado de este tema en ninguna otra asignatura, por tanto, habrá que tenerlo en cuenta a la hora de desarrollar.
+* Posibles vulnerabilidades en el proyecto web. Nunca nos han hablado de este tema en ninguna otra asignatura, por tanto, habrá que tenerlo en cuenta a la hora de desarrollar. Para mitigar este riesgo hemos tenido en cuenta algunos aspectos de seguridad, como el cifrado de contraseñas o un fichero con los datos más sensibles que utilizamos en el proyecto.
.Deudas Técnicas
@@ -16,3 +17,7 @@
* Almacenamiento de token de sesión en el localStorage, se podría guardar en un nuevo campo de la base de datos, ya que el localStorage es modificable desde el navegador
* Faltaría refactorizar parte del código del frontend para hacerlo más claro y modificable.
* Mejoras en la implementación del filtrado de productos en el apartado del listado de los mismos.
+* Mal uso de los tipos de TypeScript en algunas ocasiones por falta de experiencia, por ejemplo, usar el tipo "any" en casos innecesarios
+* Mostrar de una forma poco clara que se está accediendo a un servicio de terceros en el caso de los PODs de SOLID.
+* El carrito del cliente se pierde, no se mantiene por las diferentes ventanas.
+* Falta de mas pruebas sobre el código de front.
diff --git a/docs/12_glossary.adoc b/docs/12_glossary.adoc
index 06ba630..4a6d0ef 100644
--- a/docs/12_glossary.adoc
+++ b/docs/12_glossary.adoc
@@ -25,4 +25,9 @@
| MongoDB | Sistema de base de datos NoSQL, orientado a documentos y de código abierto
| MongoDB Atlas | Sistema gestionador de base de datos que se encarga de toda la complejidad de la implementación, la gestión y la recuperación de sus implementaciones en el proveedor de servicios en la nube de su elección
| Mongoose | Biblioteca de JavaScript que le permite definir esquemas con datos fuertemente tipados
+| AWS | Amazon Web Services es una colección de servicios de computación en la nube pública que en conjunto forman una plataforma de computación en la nube, ofrecidas a través de Internet por Amazon.com
+| EasyPost | API de envío para poder calcular los costes dentro de nuestra aplicación
+| JSON Web Token | Estándar abierto basado en JSON propuesto por IETF para la creación de tokens de acceso que permiten la propagación de identidad y privilegios o claims en inglés
+| Jest | Librería abierta para pruebas en JavaScript desarrollada por Facebook
+| Scala | Lenguaje de programación multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra sutilmente características de lenguajes funcionales y orientados a objetos
|===
diff --git a/package-lock.json b/package-lock.json
index f91f0ac..a7ae672 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2696,8 +2696,7 @@
"node_modules/@types/node": {
"version": "17.0.21",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
- "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==",
- "peer": true
+ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
},
"node_modules/@types/prop-types": {
"version": "15.7.4",
@@ -2773,6 +2772,20 @@
"@types/jest": "*"
}
},
+ "node_modules/@types/webidl-conversions": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
+ "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
+ "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
"node_modules/@types/yargs": {
"version": "16.0.4",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -3339,8 +3352,7 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "peer": true
+ ]
},
"node_modules/big-integer": {
"version": "1.6.51",
@@ -3503,6 +3515,40 @@
"node-int64": "^0.4.0"
}
},
+ "node_modules/bson": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.3.tgz",
+ "integrity": "sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==",
+ "dependencies": {
+ "buffer": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -4392,6 +4438,14 @@
"integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
"peer": true
},
+ "node_modules/denque": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
+ "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -5601,6 +5655,25 @@
"node": ">=0.10.0"
}
},
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/image-size": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz",
@@ -6537,6 +6610,11 @@
"node": "*"
}
},
+ "node_modules/kareem": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
+ "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
+ },
"node_modules/kind-of": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
@@ -6828,7 +6906,6 @@
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
},
-<<<<<<< HEAD
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -6848,8 +6925,6 @@
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
-=======
->>>>>>> Developer
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -7423,11 +7498,76 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/mongodb": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz",
+ "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==",
+ "dependencies": {
+ "bson": "^4.6.2",
+ "denque": "^2.0.1",
+ "mongodb-connection-string-url": "^2.5.2",
+ "socks": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=12.9.0"
+ },
+ "optionalDependencies": {
+ "saslprep": "^1.0.3"
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz",
+ "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==",
+ "dependencies": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "node_modules/mongoose": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.1.tgz",
+ "integrity": "sha512-bknh/VzU/7mBudfE4/5N7NR2Bpjvuxl93iePvyCGLhjeHF6w+mCRmucYGQkG6wEbCmEUVmBQrcgr2b40krMo/Q==",
+ "dependencies": {
+ "bson": "^4.6.2",
+ "kareem": "2.3.5",
+ "mongodb": "4.5.0",
+ "mpath": "0.8.4",
+ "mquery": "4.0.2",
+ "ms": "2.1.3",
+ "sift": "16.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
+ }
+ },
+ "node_modules/mpath": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
+ "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mquery": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz",
+ "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==",
+ "dependencies": {
+ "debug": "4.x"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "peer": true
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/mute-stream": {
"version": "0.0.7",
@@ -8542,6 +8682,14 @@
"once": "^1.3.1"
}
},
+ "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==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
@@ -9321,6 +9469,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@@ -9508,6 +9668,11 @@
"jsonify": "~0.0.0"
}
},
+ "node_modules/sift": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
+ "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
+ },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -9584,7 +9749,6 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "optional": true,
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
@@ -9782,7 +9946,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
"integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
- "optional": true,
"dependencies": {
"ip": "^1.1.5",
"smart-buffer": "^4.2.0"
@@ -9855,6 +10018,15 @@
"deprecated": "See https://github.com/lydell/source-map-url#deprecated",
"peer": true
},
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
+ "optional": true,
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
"node_modules/split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -10270,6 +10442,17 @@
"node": ">=0.6"
}
},
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -10597,12 +10780,32 @@
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
"integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg=="
},
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/whatwg-fetch": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
"integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==",
"peer": true
},
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -12689,8 +12892,7 @@
"@types/node": {
"version": "17.0.21",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
- "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==",
- "peer": true
+ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
},
"@types/prop-types": {
"version": "15.7.4",
@@ -12766,6 +12968,20 @@
"@types/jest": "*"
}
},
+ "@types/webidl-conversions": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
+ "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
+ },
+ "@types/whatwg-url": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
+ "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
+ "requires": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
"@types/yargs": {
"version": "16.0.4",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -13220,8 +13436,7 @@
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "peer": true
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"big-integer": {
"version": "1.6.51",
@@ -13352,6 +13567,23 @@
"node-int64": "^0.4.0"
}
},
+ "bson": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.3.tgz",
+ "integrity": "sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==",
+ "requires": {
+ "buffer": "^5.6.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -14058,6 +14290,11 @@
"integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
"peer": true
},
+ "denque": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
+ "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ=="
+ },
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -15000,6 +15237,11 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
"image-size": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz",
@@ -15746,6 +15988,11 @@
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"peer": true
},
+ "kareem": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
+ "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
+ },
"kind-of": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
@@ -15980,7 +16227,6 @@
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
},
-<<<<<<< HEAD
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -15997,8 +16243,6 @@
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
-=======
->>>>>>> Developer
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -16512,11 +16756,58 @@
"minimist": "^1.2.5"
}
},
+ "mongodb": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz",
+ "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==",
+ "requires": {
+ "bson": "^4.6.2",
+ "denque": "^2.0.1",
+ "mongodb-connection-string-url": "^2.5.2",
+ "saslprep": "^1.0.3",
+ "socks": "^2.6.2"
+ }
+ },
+ "mongodb-connection-string-url": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz",
+ "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==",
+ "requires": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "mongoose": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.1.tgz",
+ "integrity": "sha512-bknh/VzU/7mBudfE4/5N7NR2Bpjvuxl93iePvyCGLhjeHF6w+mCRmucYGQkG6wEbCmEUVmBQrcgr2b40krMo/Q==",
+ "requires": {
+ "bson": "^4.6.2",
+ "kareem": "2.3.5",
+ "mongodb": "4.5.0",
+ "mpath": "0.8.4",
+ "mquery": "4.0.2",
+ "ms": "2.1.3",
+ "sift": "16.0.0"
+ }
+ },
+ "mpath": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
+ "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g=="
+ },
+ "mquery": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz",
+ "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==",
+ "requires": {
+ "debug": "4.x"
+ }
+ },
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "peer": true
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"mute-stream": {
"version": "0.0.7",
@@ -17388,6 +17679,11 @@
"once": "^1.3.1"
}
},
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ },
"q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
@@ -17999,6 +18295,15 @@
}
}
},
+ "saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "requires": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@@ -18158,6 +18463,11 @@
"jsonify": "~0.0.0"
}
},
+ "sift": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
+ "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
+ },
"signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -18226,8 +18536,7 @@
"smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "optional": true
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
},
"snapdragon": {
"version": "0.8.2",
@@ -18389,7 +18698,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
"integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
- "optional": true,
"requires": {
"ip": "^1.1.5",
"smart-buffer": "^4.2.0"
@@ -18449,6 +18757,15 @@
"integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
"peer": true
},
+ "sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
+ "optional": true,
+ "requires": {
+ "memory-pager": "^1.0.2"
+ }
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -18784,6 +19101,14 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -19042,12 +19367,26 @@
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
"integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg=="
},
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+ },
"whatwg-fetch": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
"integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==",
"peer": true
},
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ },
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
diff --git a/restapi/Dockerfile b/restapi/Dockerfile
index 8281a44..9590a93 100644
--- a/restapi/Dockerfile
+++ b/restapi/Dockerfile
@@ -6,16 +6,16 @@ WORKDIR /app
RUN npm install
-ARG USER="DATABASE_USER"
-ENV USER=$DATABASE_USER
+ARG DATABASE_USER="DATABASE_USER"
+ENV DATABASE_USER=$DATABASE_USER
-ARG PASSWORD="DATABASE_PASSWORD"
-ENV PASSWORD=$DATABASE_PASSWORD
+ARG DATABASE_PASSWORD="DATABASE_PASSWORD"
+ENV DATABASE_PASSWORD=$DATABASE_PASSWORD
-ARG NAME="DATABASE_NAME"
-ENV NAME=$DATABASE_NAME
+ARG DATABASE_NAME="DATABASE_NAME"
+ENV DATABASE_NAME=$DATABASE_NAME
-ARG TOKEN="JWT_TOKEN"
-ENV TOKEN=$JWT_TOKEN
+ARG JWT_TOKEN="JWT_TOKEN"
+ENV JWT_TOKEN=$JWT_TOKEN
CMD [ "npm", "start" ]
\ No newline at end of file
diff --git a/restapi/package-lock.json b/restapi/package-lock.json
index a1a0223..ecdacc3 100644
--- a/restapi/package-lock.json
+++ b/restapi/package-lock.json
@@ -9,8 +9,10 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
+ "@easypost/api": "^5.0.0",
"@inrupt/solid-client": "^1.21.0",
"@inrupt/vocab-common-rdf": "^1.0.3",
+ "babel-polyfill": "^6.26.0",
"bcrypt": "^5.0.1",
"body-parser": "^1.19.1",
"cors": "^2.8.5",
@@ -22,7 +24,8 @@
"mogodb": "^0.0.1-security",
"mongodb": "^4.4.1",
"mongoose": "^6.2.8",
- "prom-client": "^14.0.1"
+ "prom-client": "^14.0.1",
+ "shippo": "^1.7.1"
},
"devDependencies": {
"@types/cors": "^2.8.12",
@@ -674,6 +677,131 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@easypost/api": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@easypost/api/-/api-5.0.0.tgz",
+ "integrity": "sha512-4aYJGa2TsIXiDYPMO0UiGV+p8geqLPPYqmVgvHEL99/rCjjsgzCI+/94zoe4xQyKpQhgwG0mTVN6Y+KtuWcJvw==",
+ "dependencies": {
+ "core-js": "3.19.3",
+ "nodent-runtime": "3.2.1",
+ "proptypes": "1.1.0",
+ "regenerator-runtime": "0.13.9",
+ "source-map-support": "0.5.21",
+ "superagent": "7.1.1",
+ "yargs": "16.2.0"
+ },
+ "bin": {
+ "easypost": "repl.js"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@easypost/api/node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/formidable": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz",
+ "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==",
+ "dependencies": {
+ "dezalgo": "1.0.3",
+ "hexoid": "1.0.0",
+ "once": "1.4.0",
+ "qs": "6.9.3"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/formidable/node_modules/qs": {
+ "version": "6.9.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
+ "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/@easypost/api/node_modules/qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@easypost/api/node_modules/superagent": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz",
+ "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==",
+ "dependencies": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.3",
+ "debug": "^4.3.3",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.0",
+ "formidable": "^2.0.1",
+ "methods": "^1.1.2",
+ "mime": "^2.5.0",
+ "qs": "^6.10.1",
+ "readable-stream": "^3.6.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=6.4.0 <13 || >=14"
+ }
+ },
"node_modules/@inrupt/solid-client": {
"version": "1.21.0",
"resolved": "https://registry.npmjs.org/@inrupt/solid-client/-/solid-client-1.21.0.tgz",
@@ -1460,7 +1588,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -1521,11 +1648,15 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"node_modules/babel-jest": {
"version": "27.4.6",
@@ -1580,6 +1711,28 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "regenerator-runtime": "^0.10.5"
+ }
+ },
+ "node_modules/babel-polyfill/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.4 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. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true
+ },
+ "node_modules/babel-polyfill/node_modules/regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ },
"node_modules/babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -1619,6 +1772,27 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.4 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. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true
+ },
+ "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1803,8 +1977,7 @@
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"node_modules/bytes": {
"version": "3.1.1",
@@ -1814,6 +1987,18 @@
"node": ">= 0.8"
}
},
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1917,7 +2102,6 @@
"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",
@@ -1944,7 +2128,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -1955,8 +2138,7 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/color-support": {
"version": "1.1.3",
@@ -1970,7 +2152,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -1981,8 +2162,7 @@
"node_modules/component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"node_modules/concat-map": {
"version": "0.0.1",
@@ -2044,8 +2224,17 @@
"node_modules/cookiejar": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
- "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
- "dev": true
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ=="
+ },
+ "node_modules/core-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz",
+ "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
},
"node_modules/cors": {
"version": "2.8.5",
@@ -2172,7 +2361,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -2223,6 +2411,15 @@
"node": ">=8"
}
},
+ "node_modules/dezalgo": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
+ "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -2327,7 +2524,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -2552,8 +2748,7 @@
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
},
"node_modules/fb-watchman": {
"version": "2.0.1",
@@ -2692,8 +2887,7 @@
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/gauge": {
"version": "3.0.2",
@@ -2727,11 +2921,23 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
+ "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==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -2803,7 +3009,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
@@ -2820,11 +3025,30 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"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="
},
+ "node_modules/hexoid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
+ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/html-encoding-sniffer": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
@@ -4569,6 +4793,12 @@
"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
"dev": true
},
+ "node_modules/nodent-runtime": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz",
+ "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==",
+ "hasInstallScript": true
+ },
"node_modules/nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -4629,6 +4859,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -4865,6 +5103,11 @@
"node": ">= 6"
}
},
+ "node_modules/proptypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proptypes/-/proptypes-1.1.0.tgz",
+ "integrity": "sha1-eLOCilqmuxMIk54N48YETf1L0jk="
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -4993,11 +5236,15 @@
"node": ">=8.10.0"
}
},
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
"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=",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5197,6 +5444,27 @@
"node": ">=8"
}
},
+ "node_modules/shippo": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/shippo/-/shippo-1.7.1.tgz",
+ "integrity": "sha512-kALIuHGjGhSAq2Yvz9sLewxgJkC82/bsUqjAXOT9jfW0T1LPxRouwFkBUBsgYe68qlbyrMjfpIbtg5Mx7t4SMw==",
+ "engines": {
+ "node": ">= v0.12.18"
+ }
+ },
+ "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==",
+ "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/sift": {
"version": "16.0.0",
"resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
@@ -5248,7 +5516,6 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5257,7 +5524,6 @@
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -5966,7 +6232,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -6042,7 +6307,6 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
"engines": {
"node": ">=10"
}
@@ -6056,7 +6320,6 @@
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -6074,7 +6337,6 @@
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
"engines": {
"node": ">=10"
}
@@ -6570,6 +6832,94 @@
"ky-universal": "^0.8.2"
}
},
+ "@easypost/api": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@easypost/api/-/api-5.0.0.tgz",
+ "integrity": "sha512-4aYJGa2TsIXiDYPMO0UiGV+p8geqLPPYqmVgvHEL99/rCjjsgzCI+/94zoe4xQyKpQhgwG0mTVN6Y+KtuWcJvw==",
+ "requires": {
+ "core-js": "3.19.3",
+ "nodent-runtime": "3.2.1",
+ "proptypes": "1.1.0",
+ "regenerator-runtime": "0.13.9",
+ "source-map-support": "0.5.21",
+ "superagent": "7.1.1",
+ "yargs": "16.2.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "formidable": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz",
+ "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==",
+ "requires": {
+ "dezalgo": "1.0.3",
+ "hexoid": "1.0.0",
+ "once": "1.4.0",
+ "qs": "6.9.3"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.9.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
+ "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw=="
+ }
+ }
+ },
+ "mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "superagent": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz",
+ "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==",
+ "requires": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.3",
+ "debug": "^4.3.3",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.0",
+ "formidable": "^2.0.1",
+ "methods": "^1.1.2",
+ "mime": "^2.5.0",
+ "qs": "^6.10.1",
+ "readable-stream": "^3.6.0",
+ "semver": "^7.3.5"
+ }
+ }
+ }
+ },
"@inrupt/solid-client": {
"version": "1.21.0",
"resolved": "https://registry.npmjs.org/@inrupt/solid-client/-/solid-client-1.21.0.tgz",
@@ -7244,7 +7594,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -7293,11 +7642,15 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"babel-jest": {
"version": "27.4.6",
@@ -7340,6 +7693,28 @@
"@types/babel__traverse": "^7.0.6"
}
},
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "regenerator-runtime": "^0.10.5"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ },
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ }
+ }
+ },
"babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -7370,6 +7745,27 @@
"babel-preset-current-node-syntax": "^1.0.0"
}
},
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ }
+ }
+ },
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -7497,14 +7893,22 @@
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"bytes": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
"integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg=="
},
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -7581,7 +7985,6 @@
"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",
@@ -7604,7 +8007,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -7612,8 +8014,7 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"color-support": {
"version": "1.1.3",
@@ -7624,7 +8025,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -7632,8 +8032,7 @@
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"concat-map": {
"version": "0.0.1",
@@ -7688,8 +8087,12 @@
"cookiejar": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
- "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
- "dev": true
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ=="
+ },
+ "core-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz",
+ "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g=="
},
"cors": {
"version": "2.8.5",
@@ -7799,8 +8202,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegates": {
"version": "1.0.0",
@@ -7833,6 +8235,15 @@
"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true
},
+ "dezalgo": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
+ "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+ "requires": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -7914,8 +8325,7 @@
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
},
"escape-html": {
"version": "1.0.3",
@@ -8079,8 +8489,7 @@
"fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
},
"fb-watchman": {
"version": "2.0.1",
@@ -8179,8 +8588,7 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"gauge": {
"version": "3.0.2",
@@ -8207,8 +8615,17 @@
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
},
"get-package-type": {
"version": "0.1.0",
@@ -8260,7 +8677,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
"requires": {
"function-bind": "^1.1.1"
}
@@ -8271,11 +8687,21 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
+ "hexoid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
+ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g=="
+ },
"html-encoding-sniffer": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
@@ -9604,6 +10030,11 @@
"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
"dev": true
},
+ "nodent-runtime": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz",
+ "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA=="
+ },
"nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -9649,6 +10080,11 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
+ "object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -9821,6 +10257,11 @@
"sisteransi": "^1.0.5"
}
},
+ "proptypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proptypes/-/proptypes-1.1.0.tgz",
+ "integrity": "sha1-eLOCilqmuxMIk54N48YETf1L0jk="
+ },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -9908,11 +10349,15 @@
"picomatch": "^2.2.1"
}
},
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
},
"resolve": {
"version": "1.20.0",
@@ -10058,6 +10503,21 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
+ "shippo": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/shippo/-/shippo-1.7.1.tgz",
+ "integrity": "sha512-kALIuHGjGhSAq2Yvz9sLewxgJkC82/bsUqjAXOT9jfW0T1LPxRouwFkBUBsgYe68qlbyrMjfpIbtg5Mx7t4SMw=="
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
"sift": {
"version": "16.0.0",
"resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz",
@@ -10097,14 +10557,12 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -10616,7 +11074,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -10668,8 +11125,7 @@
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
},
"yallist": {
"version": "4.0.0",
@@ -10680,7 +11136,6 @@
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -10694,8 +11149,7 @@
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
},
"yn": {
"version": "3.1.1",
diff --git a/restapi/package.json b/restapi/package.json
index e8d40ec..0d3d485 100644
--- a/restapi/package.json
+++ b/restapi/package.json
@@ -9,8 +9,10 @@
"author": "",
"license": "ISC",
"dependencies": {
+ "@easypost/api": "^5.0.0",
"@inrupt/solid-client": "^1.21.0",
"@inrupt/vocab-common-rdf": "^1.0.3",
+ "babel-polyfill": "^6.26.0",
"bcrypt": "^5.0.1",
"body-parser": "^1.19.1",
"cors": "^2.8.5",
@@ -22,7 +24,8 @@
"mogodb": "^0.0.1-security",
"mongodb": "^4.4.1",
"mongoose": "^6.2.8",
- "prom-client": "^14.0.1"
+ "prom-client": "^14.0.1",
+ "shippo": "^1.7.1"
},
"devDependencies": {
"@types/cors": "^2.8.12",
diff --git a/restapi/server.ts b/restapi/server.ts
index bb3e891..b59a175 100644
--- a/restapi/server.ts
+++ b/restapi/server.ts
@@ -7,6 +7,9 @@ import userRoutes from "./src/routes/UserRoutes";
require('dotenv').config();
import productRoutes from "./src/routes/ProductRoutes";
import orderRoutes from "./src/routes/OrderRoutes";
+import reviewRoutes from "./src/routes/ReviewRoutes";
+import cartRoutes from "./src/routes/CartRoutes";
+
const app: Application = express();
@@ -20,7 +23,7 @@ const options: cors.CorsOptions = {
const metricsMiddleware:RequestHandler = promBundle({includeMethod: true});
app.use(metricsMiddleware);
-app.use(cors(options));
+app.use(cors());
app.use(bp.json());
app.use("/api", api)
@@ -28,6 +31,8 @@ app.use("/api", api)
app.use(userRoutes);
app.use(productRoutes);
app.use(orderRoutes);
+app.use(reviewRoutes);
+app.use(cartRoutes);
app.listen(port, ():void => {
console.log('Restapi listening on '+ port);
diff --git a/restapi/src/controllers/CartController.ts b/restapi/src/controllers/CartController.ts
new file mode 100644
index 0000000..7717df1
--- /dev/null
+++ b/restapi/src/controllers/CartController.ts
@@ -0,0 +1,124 @@
+import { RequestHandler } from "express";
+import { ObjectId } from "mongodb";
+const { response, request } = require('express')
+import { Cart } from "../model/Cart";
+import { User } from "../model/User";
+import { Product } from "../model/Product";
+
+export const createCart = async (req = request, res = response) => {
+ try{
+ const { client_id} = req.body
+ if(await checkClient(client_id)){
+ if(await checkCart(client_id)){
+ const cart = new Cart();
+ cart.client_id = client_id;
+ cart.products = [];
+ await cart.save();
+ return res.status(201).json({
+ cart
+ })
+ }else{
+ return res.status(400).json({message: 'The cart already exists'});
+ }
+ }else{
+ return res.status(404).json({message: 'User not found'});
+ }
+ }catch(error){
+ return res.status(400).json({msg: error})
+ }
+};
+
+export const addProduct = async (req = request, res = response) => {
+ try{
+ const { client_id,product} = req.body
+ var cart = await Cart.findOne({client_id:client_id.toString()})
+ if(cart.products.length > 0){
+ for (let index = 0; index < cart.products.length; index++) {
+ if(cart.products[index].product.codigo === product.codigo){
+ cart.products[index].quantity += 1;
+ await Cart.updateOne({client_id: client_id.toString()},cart)
+ return res.status(200).json({cart})
+ }
+ }
+ let newProduct = {
+ product: product,
+ quantity:1
+ }
+ cart.products.push(newProduct);
+ await Cart.updateOne({client_id: client_id.toString()},cart)
+ return res.status(200).json({cart})
+ }else{
+ let products = [
+ {
+ product: product,
+ quantity:1
+ },
+ ]
+ await Cart.updateOne({client_id: client_id.toString()},{$push: {products: products}});
+ return res.status(200).json({products})
+ }
+ }catch(error){
+ return res.status(400).json({msg: error})
+ }
+};
+
+export const deleteProduct = async (req = request, res = response) => {
+ try{
+ const { client_id,product} = req.body
+ var cart = await Cart.findOne({client_id:client_id.toString()})
+ if(cart.products.length > 0){
+ for (let index = 0; index < cart.products.length; index++) {
+ if(cart.products[index].product.codigo === product.codigo){
+ cart.products[index].quantity -= 1;
+ if(cart.products[index].quantity > 0){
+ await Cart.updateOne({client_id: client_id.toString()},cart)
+ return res.status(200).json({cart})
+ }else{
+ cart.products.splice(index,1)
+ await Cart.updateOne({client_id: client_id.toString()},cart)
+ return res.status(200).json({cart})
+ }
+ }
+ }
+ }
+ return res.status(200).json({msg: "The cart was empty"})
+ }catch(error){
+ return res.status(400).json({msg: error})
+ }
+};
+
+export const findByClientId = async (req = request, res = response) => {
+ try{
+ const client_id = req.params.client_id
+ var cart = await Cart.findOne({client_id:client_id.toString()})
+ if(cart){
+ return res.status(200).json(cart)
+ }
+ return res.status(404).json({msg: "Cart not found"})
+ }catch(error){
+ return res.status(404).json({msg: "Cart not found"})
+ }
+};
+
+async function checkClient(client_id: ObjectId):Promise{
+ if(client_id){
+ const userFound = await User.findOne({_id: client_id.toString()});
+ if(userFound){
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+async function checkCart(client_id: ObjectId):Promise {
+ if(client_id){
+ const cartFound = await Cart.findOne({client_id: client_id.toString()});
+ if(cartFound){
+ return false;
+ }else{
+ return true;
+ }
+ }
+ return false;
+}
+
diff --git a/restapi/src/controllers/OrderController.ts b/restapi/src/controllers/OrderController.ts
index 8ba635c..da9449b 100644
--- a/restapi/src/controllers/OrderController.ts
+++ b/restapi/src/controllers/OrderController.ts
@@ -3,71 +3,110 @@ import { orderModel } from "../model/Order";
import { Product, productModel } from "../model/Product";
-
+const ShipmentCosts = require('../util/apiEasyPost')
/************* CREAR UN PEDIDO *************/
export const addOrder: RequestHandler = async (req, res) => {
-
+ console.log("Base de datos")
+
// Hay que actualizar el stock
- const updateStock = async (products: any) => {
+ const updateNewStock = async (products: any) => {
+ console.log(products)
for (var i = 0; i < products.length; i++) {
let product = await productModel.findOne({ codigo: products[i].codigo });
product.stock = product.stock - products[i].stock;
- product.save();
+ product.save(); // Se actualiza el stock de los productos
}
};
+
+ // Calculas el precio total
+
+ var totalPrice = 0;
+ const updateTotalPrice = async (products: any) => {
+ for (var i = 0; i < products.length; i++) {
+ totalPrice = totalPrice + products[i].precio;
+ }
+ totalPrice = totalPrice * 1.21; // El IVA
+ };
+
+
try {
- const order = new orderModel(req.body);
- updateStock(order.products);
- const orderToSave = await order.save();
- res.json(orderToSave);
+ if (checkParams(req.body)){
+ const order = new orderModel(req.body);
+
+ updateTotalPrice(order.products)
+ order.precioTotal = totalPrice
+
+ updateNewStock(order.products);
+ const orderToSave = await order.save();
+ res.json(orderToSave);
+ } else {
+ return res.status(412).json({message: "Incomplete order"});
+ }
} catch (error) {
- res.status(412).json();
+ return res.status(404).json();
}
};
-/************* GENERAR UN EJEMPLO *************/
+function checkParams(body: any): boolean{
+ const {codigo, correo, direccion, fecha, precioTotal, products} = body;
+ return codigo != null && codigo != '' && correo != null && correo != '' &&
+ direccion != null && direccion != '' && fecha != null && products != null
+}
+
+
+
+/************* BORRAR UN PEDIDO *************/
+
+export const deleteOrder: RequestHandler = async (req, res) => {
+ try{
+ const {codigo} = req.params;
+ const orderDeleted = await orderModel.deleteOne({codigo: codigo});
+ if (orderDeleted.deletedCount == 1){
+ return res.send("Order deleted");
+ } else {
+ return res.status(412).json({ message: "The operation didn't succed "});
+ }
+ }catch (err){
+ return res.status(404).json({message: "There was a problem deleting an order"});
+ }
+}
+
+
export const generateExample: RequestHandler = async(req, res, next) => {
try {
let order = new orderModel();
- order.codigo = "orderTwoExample";
+ order.codigo = "orderXExample";
order.correo = "admin@uniovi.es";
order.direccion = "dirExample";
order.fecha = new Date();
order.precioTotal = 139.99;
-
- var productA = new productModel (
+ order.products = [
{
codigo: "TE01",
categoria: "teclado",
nombre: "Logitech K120 Teclado con Cable",
precio: 9.57,
descripcion: "Para Windows, Tamaño Normal, Resistante a Líquido, Barra Espaciadora Curvada, PC/Portátil, Disposición QWERTY Español, color Negro ",
- stock: 100,
+ stock: 1,
url: "https://i.postimg.cc/25fVD0hz/TE01.jpg"
- }
- );
-
- var productB = new productModel (
+ },
{
codigo: "RA01",
categoria: "raton",
nombre: "Logitech Ratón Inalámbrico M190",
precio: 15.99,
descripcion: "Diseño Curvo Ambidiestro, Batería 18 Meses con Modo Ahorro, Receptor USB, Cursor y Desplazamiento Preciso, Rueda de Desplazamiento Amplio, Negro",
- stock: 50,
+ stock: 5,
url: "https://i.postimg.cc/RVyWPS0J/RA01.jpg"
}
- )
- var productos = [productA, productB];
-
- order.products = productos;
+ ]
order.save();
return res.json(order);
} catch (error){
@@ -129,160 +168,15 @@ export const getOrders: RequestHandler = async (req, res) => {
};
-// MÉTODOS QUE COMO DE MOMENTO NO USO Y ME PIDEN COBERTURA DE CÓDIGO DEJO COMENTADOS
-
+/************* CÁLCULO DE ENVÍOS CON SHIPPO *************/
-/**
-export const addOrderURL: RequestHandler = async(req, res, next) => {
- try {
- if (checkParams(req.params)){
- const orderEncontrada = await Order.findOne({codigo: req.params.codigo});
- if (orderEncontrada == null){
- const codigo = req.params.codigo;
- const correo = req.params.correo;
- const fecha = req.params.fecha;
- const direccion = req.params.direccion;
- const precioTotal = req.params.precioTotal;
- const productos = req.params.productos;
- const order = new Order({codigo: codigo, correo: correo, direccion: direccion, fecha: fecha,
- precioTotal: precioTotal, productos: productos});
- await order.save();
- return res.send("New order OK")
- } else {
- return res.send("There was a problem adding an order")
- }
- }
+export const getShippmentCost: RequestHandler = async (req, res) => {
+ const addressTo = req.body;
+ try{
+ console.log("En OrderController OK")
+ var costs = await ShipmentCosts(addressTo);
+ return res.status(200).send({shippmentCost: costs});
} catch (error){
- console.log(error);
- }
-}
-
-export const addOrderForm: RequestHandler = async(req, res, next) => {
- try {
- if (checkParams(req.body)){
- const orderEncontrada = await Order.findOne({codigo: req.body.codigo});
- if (orderEncontrada == null){
- const codigo = req.body.codigo;
- const correo = req.body.correo;
- const fecha = req.body.fecha;
- const direccion = req.body.direccion;
- const precioTotal = req.body.precioTotal;
- const productos = req.body.productos;
- const order = new Order({codigo: codigo, correo: correo, direccion: direccion, fecha: fecha,
- precioTotal: precioTotal, productos: productos});
- await order.save();
- return res.send("New order OK")
- } else {
- return res.send("There was a problem adding an order")
- }
- }
- } catch (error){
- console.log(error);
- }
-}
-
-export const deleteOrderURL: RequestHandler = async (req, res) => {
- try {
- const {codigo} = req.params;
- await Order.deleteOne({codigo: codigo});
- return res.send("Order deleted")
- } catch (error) {
- return res.status(404).json({message: 'There was a problem deleting a order'});
- }
-};
-
-export const deleteOrderForm: RequestHandler = async (req, res) => {
- try {
- const {codigo} = req.body;
- await Order.deleteOne({codigo: codigo});
- return res.send("Order deleted")
- } catch (error) {
- return res.status(404).json({message: 'There was a problem deleting a order'});
- }
-};
-
-
-export const updateOrderURL: RequestHandler = async (req, res) => {
- // Se pueden actualizar tanto el correo como la direccion
- try {
- const codigo = req.params.codigo;
- const {...params} = req.params;
- await Order.findOneAndUpdate({codigo: codigo}, params);
- return res.send("Order updated")
- } catch (error) {
- console.log(error)
- return res.status(404).json({message: 'There was a problem updating a order'});
- }
- };
-
- export const updateOrderPOST: RequestHandler = async (req, res) => {
- // Se pueden actualizar tanto el correo como la direccion
- try {
- const codigo = req.body.codigo;
- const {...body} = req.body;
- await Order.findOneAndUpdate({codigo: codigo}, body);
- return res.send("Order updated")
- } catch (error) {
- console.log(error)
- return res.status(404).json({message: 'There was a problem updating a order'});
- }
- };
-
-
-
-
-function checkParams(body: any): boolean{
- const {codigo, correo, direccion, fecha, precioTotal} = body;
- return codigo != null && codigo != '' && correo != null && correo != '' &&
- direccion != null && direccion != '' && fecha != null && precioTotal > 0
-}
-
-**/
-
-
-/**
-
- export const getOrderByID: RequestHandler = async (req, res) => {
- const id = req.params.id;
- try {
- const encontrado = await Order.findOne({_id: id});
- return res.json(encontrado)
- }catch(error){
- return res.status(404).json({message: 'No hay pedido con ese ID'});
+ return res.status(404).json({message: 'Hubo un fallo procesando los costes'});
}
-}
-
-
- export const getOrderByPrice: RequestHandler = async (req, res) => {
- const price = req.params.price;
- try {
- const encontrado = await Order.findOne({precioTotal: price});
- return res.json(encontrado)
- }catch(error){
- return res.status(404).json({message: 'No hay pedido con ese precio'});
- }
-}
-
- export const getOrderByDirection: RequestHandler = async (req, res) => {
- const dir = req.params.dir;
- try {
- const encontrado = await Order.findOne({direccion: dir});
- return res.json(encontrado)
- }catch(error){
- return res.status(404).json({message: 'No hay pedido con esa direccion'});
- }
-}
-
-
- export const getOrderByDate: RequestHandler = async (req, res) => {
- const date = req.params.date;
- try {
- const encontrado = await Order.findOne({fecha: date});
- return res.json(encontrado)
- }catch(error){
- return res.status(404).json({message: 'No hay pedido con esa fecha'});
- }
-}
-
-
- **/
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/restapi/src/controllers/ProductController.ts b/restapi/src/controllers/ProductController.ts
index d4d3a29..6296d93 100644
--- a/restapi/src/controllers/ProductController.ts
+++ b/restapi/src/controllers/ProductController.ts
@@ -3,12 +3,9 @@ import { Product, productModel } from "../model/Product";
const ProductPost = require('../model/Product')
-// FALTA LA VERIFICACIÓN DE LOS TOKENS
-
/************* POST CON LOS PRODUCTOS *************/
export const addProductPost : RequestHandler= async (req = request, res = response) => {
- // EJEMPLO: localhost:5000/product/add/codeExample/categoryExample/nameExample/10/descriptionExample/3/urlExample
try {
// Hay que buscar que no exista
const productoPrevio = await productModel.findOne({codigo: req.body.codigo})
@@ -35,10 +32,10 @@ export const deleteProduct: RequestHandler = async (req, res) => {
try{
const {codigo} = req.params;
const productDeleted = await productModel.deleteOne({codigo: codigo});
- if (productDeleted){
+ if (productDeleted.deletedCount == 1){
return res.send("Product deleted");
} else {
- return res.status(301).json({ message: "The operation didn't succed "});
+ return res.status(412).json({ message: "The operation didn't succed "});
}
}catch (err){
return res.status(404).json({message: "There was a problem deleting a prodcut"});
@@ -53,9 +50,10 @@ export const updateProduct: RequestHandler = async (req, res) => {
const productUpdated = await productModel.findOneAndUpdate({codigo: codigo}, req.query, { new: true });
if (productUpdated){
return res.send("Product updated");
+ } else {
+ return res.status(412).json({ message: "The operation didn't succed "});
}
}catch (err){
- console.log(err);
return res.status(404).json({message: "There was a problem updating a product"})
}
}
@@ -103,13 +101,23 @@ export const generateExample: RequestHandler = async(req, res, next) => {
if (encontrado){
return res.json(encontrado)
} else {
- return res.status(204).json();
+ return res.status(412).json();
}
}catch(error){
return res.status(404).json();
}
}
+export const getProductoByCodigo: RequestHandler = async (req, res) => {
+ const cod = req.params.codigo;
+ const encontrado = await productModel.findOne({codigo: cod});
+ if (encontrado){
+ return res.json(encontrado)
+ } else {
+ return res.status(404).json();
+ }
+}
+
export const getProducts: RequestHandler = async (req, res) => {
try {
const allP = await productModel.find();
@@ -123,10 +131,10 @@ export const getProductsByCategoria: RequestHandler = async (req, res) => {
try {
const encontrado = await productModel.find({categoria: req.params.categoria});
- if (encontrado){
+ if (encontrado.length != 0){
return res.json(encontrado)
} else {
- return res.status(204).json();
+ return res.status(412).json();
}
}catch(error){
res.status(404).json({message: 'No hay productos de esa categoría'})
@@ -136,54 +144,14 @@ export const getProductsByCategoria: RequestHandler = async (req, res) => {
export const getProductByPrice: RequestHandler = async (req, res) => {
const precio = req.params.precio;
try{
- const todos = await Product.findOne({precio: precio});
- if (todos){
- return res.json(todos)
+ const productos = await productModel.find({precio: {$eq: precio}} );
+ if (productos.length != 0){
+ return res.json(productos)
} else {
- return res.status(204).json();
+ return res.status(412).json();
}
}catch(error){
res.status(404).json({message: 'No hay productos con ese precio'})
}
}
-
-
-
-// MÉTODOS QUE COMO DE MOMENTO NO USO Y ME PIDEN COBERTURA DE CÓDIGO DEJO COMENTADOS
-
-/**
-
-
-export const getProductoByID: RequestHandler = async (req, res) => {
- const id = req.params.id;
- try {
- const encontrado = await Product.findOne({_id: id});
- return res.json(encontrado)
- }catch(error){
- return res.status(404).json({message: 'No hay producto con ese ID'});
- }
-}
-
-export const getProductsByCategoria: RequestHandler = async (req, res) => {
-
- try {
- const encontrado = await Product.find({categoria: req.params.categoria});
- return res.json(encontrado);
- }catch(error){
- res.status(404).json({message: 'No hay productos de esa categoría'})
- }
-}
-
-export const getProductByPrice: RequestHandler = async (req, res) => {
- const price = req.params.price;
- try{
- const todos = await Product.find({precio: price});
- return res.json(todos);
- }catch(error){
- console.log(error);
- res.json(error);
- }
-}
-
- **/
\ No newline at end of file
diff --git a/restapi/src/controllers/ReviewController.ts b/restapi/src/controllers/ReviewController.ts
new file mode 100644
index 0000000..f01504a
--- /dev/null
+++ b/restapi/src/controllers/ReviewController.ts
@@ -0,0 +1,67 @@
+import { RequestHandler } from "express";
+import { reviewModel } from "../model/Review";
+
+
+/************* CREAR UNA REVIEW ************/
+
+export const addReview: RequestHandler = async (req, res) => {
+
+ const review = new reviewModel(req.body);
+ try {
+ const reviewSaved = await review.save();
+ res.json(reviewSaved);
+ } catch (error) {
+ res.status(412).json({ message: "Can't register that review, is not valid" }); // Como ya pongo required = true no hace falta hacer comprobaciones extras
+ }
+};
+
+/************* OBTENER REVIEWS *************/
+
+export const getReviewsByProduct: RequestHandler = async (req, res) => {
+ try{
+ const reviews = await reviewModel.find({
+ productCode: req.params.codigo,
+ });
+ return res.json(reviews);
+ } catch (err){
+ return res.status(404).json({message: "There was a problem getting a review"});
+ }
+}
+
+
+export const getReviewByUserAndProduct: RequestHandler = async (req, res) => {
+ try {
+ const review = await reviewModel.findOne({ // Tiene que cumplir LAS DOS CARACTERÍSTICAS
+ productCode: req.params.codigo,
+ userEmail: req.params.email,
+ });
+ if (review) {
+ return res.json(review);
+ } else {
+ return res.status(412).json();
+ }
+ } catch (err){
+ return res.status(404).json({message: "There was a problem getting a review"});
+ }
+};
+
+
+/************* ELIMINAR REVIEW ************/
+
+export const deleteReviewByUserAndProduct: RequestHandler = async (req, res) => {
+ try {
+ const review = await reviewModel.deleteOne({ // Tiene que cumplir LAS DOS CARACTERÍSTICAS
+ productCode: req.params.codigo,
+ userEmail: req.params.email,
+ });
+ if (review.deletedCount == 1) {
+ return res.json("Rating deleted");
+ }
+ else {
+ return res.status(412).json({ message: "The operation didn't succed "});
+ }
+ } catch (err){
+ return res.status(404).json({message: "There was a problem deleting a review"});
+ }
+ };
+
\ No newline at end of file
diff --git a/restapi/src/controllers/UserController.ts b/restapi/src/controllers/UserController.ts
index 8316e39..03a0b9c 100644
--- a/restapi/src/controllers/UserController.ts
+++ b/restapi/src/controllers/UserController.ts
@@ -35,7 +35,7 @@ export const findUsersByEmail: RequestHandler = async (req, res) => {
if (userFound){
return res.json(userFound)
} else {
- return res.status(204).json();
+ return res.status(412).json();
}
};
@@ -43,23 +43,24 @@ export const createUser = async (req = request, res = response) => {
var bcrypt = require('bcrypt');
try{
if(checkBody(req.body)){
- const { password, ...body } = req.body
- const user = new User(body)
- const passwordHashed = await bcrypt.hash(password, 10);
- user.password = passwordHashed;
- await user.save();
- res.status(201).json({
- user
- })
+ const { password, ...body } = req.body
+ const user = new User(body)
+ const passwordHashed = await bcrypt.hash(password.toString(), 10);
+ user.password = passwordHashed;
+ await user.save();
+ return res.status(201).json({
+ user
+ })
+
}
} catch(err) {
- console.log(err)
- res.status(400).json({msg: err})
+ return res.status(400).json({msg: err})
}
};
function checkBody(body:any):boolean{
- const { name,surname,email,password,repPassword, } =body;
+ const { name,surname,email,password,repPassword } = body;
+
return name != '' && surname != '' && email != '' && password != '' && password == repPassword;
}
@@ -72,7 +73,7 @@ export const loginUser: RequestHandler = async (req, res) => {
if(userFound){
if(await bcrypt.compare(password,userFound.password)){
const token = generateToken(userFound.id,userFound.role)
- res.status(201).json({
+ return res.status(201).json({
token,
userFound
});
@@ -84,7 +85,6 @@ export const loginUser: RequestHandler = async (req, res) => {
}
} catch (error) {
- console.log(error)
return res.status(404).json({message: 'There was a problem logging a user'});
}
@@ -122,7 +122,6 @@ export const update: RequestHandler = async (req, res) => {
await User.updateOne({_id: id},params);
return res.send("User updated")
} catch (error) {
- console.log(error)
return res.status(404).json({message: 'There was a problem updating a user'});
}
};
@@ -143,7 +142,6 @@ export const giveAdminRole: RequestHandler = async (req, res) => {
return res.status(404).json("El usuario a cambiar el rol no existe")
}
} catch (error) {
- console.log(error)
return res.status(404).json({message: 'Hubo un problema cambiando el rol al usuario'});
}
};
@@ -180,6 +178,6 @@ export const getUserPOD: RequestHandler = async (req, res) => {
country: result[4],
})
} catch (error) {
- return res.status(404).json({message: 'No se ha encontrado el POD con ese nombre'});
+ return res.status(412).json({message: 'No se ha encontrado el POD con ese nombre'});
}
};
\ No newline at end of file
diff --git a/restapi/src/middlewares/signupValidator.ts b/restapi/src/middlewares/signupValidator.ts
new file mode 100644
index 0000000..5e4375a
--- /dev/null
+++ b/restapi/src/middlewares/signupValidator.ts
@@ -0,0 +1,18 @@
+import { Request, Response, NextFunction } from "express";
+import { body,validationResult } from "express-validator";
+
+export const validateEmail = [
+ body("email")
+ .trim()
+ .not()
+ .isEmpty()
+ .withMessage("Email is empty")
+ .isEmail()
+ .withMessage("Invalid e-mail format"),
+ (req: Request, res: Response, next : NextFunction) => {
+ const errors = validationResult(req);
+ if(!errors.isEmpty())
+ return res.status(400).json({ errors: errors.array() });
+ next();
+ }
+];
\ No newline at end of file
diff --git a/restapi/src/model/Cart.ts b/restapi/src/model/Cart.ts
new file mode 100644
index 0000000..b60a541
--- /dev/null
+++ b/restapi/src/model/Cart.ts
@@ -0,0 +1,27 @@
+const mongoose = require('mongoose')
+
+import { ObjectId } from "mongodb";
+import { Product } from "../model/Product";
+
+const CartSchema = new mongoose.Schema({
+ client_id: {
+ type: ObjectId,
+ required: true,
+ },
+ products: [
+ {
+ product: {
+ type: Product
+ },
+ quantity: {
+ type: Number,
+ default: 1,
+ },
+ },
+ ],
+ },
+ { collection: 'Cart' })
+
+
+
+export const Cart = mongoose.model('Cart', CartSchema);
\ No newline at end of file
diff --git a/restapi/src/model/Order.ts b/restapi/src/model/Order.ts
index ba347a9..078b63c 100644
--- a/restapi/src/model/Order.ts
+++ b/restapi/src/model/Order.ts
@@ -22,7 +22,6 @@ const OrderShema = new mongoose.Schema({
},
precioTotal: {
type: Number,
- required: true,
min: 0
},
products: {
diff --git a/restapi/src/model/Review.ts b/restapi/src/model/Review.ts
new file mode 100644
index 0000000..acd6282
--- /dev/null
+++ b/restapi/src/model/Review.ts
@@ -0,0 +1,31 @@
+const mongoose = require('mongoose')
+
+const ReviewSchema = new mongoose.Schema({
+ score : {
+ type: Number,
+ index: true,
+ required: true,
+ min: 0,
+ max: 10
+ },
+ comment : {
+ type: String,
+ required: true
+ },
+ authorEmail: {
+ type: String,
+ required: true,
+ trim: true
+ },
+ productCode: {
+ type: String,
+ required: true,
+ trim: true
+ }
+ },
+ {collection:'Review'});
+
+// Para establecer cardinalidad
+ReviewSchema.index({authorEmail: 1, productCode: 1}, {unique: true})
+
+export const reviewModel = mongoose.model('Review',ReviewSchema,'Review');
diff --git a/restapi/src/routes/CartRoutes.ts b/restapi/src/routes/CartRoutes.ts
new file mode 100644
index 0000000..097b161
--- /dev/null
+++ b/restapi/src/routes/CartRoutes.ts
@@ -0,0 +1,10 @@
+const express = require("express");
+import * as CartController from '../controllers/CartController';
+const router = express.Router();
+
+router.post('/cart/add', CartController.createCart);
+router.put('/cart/addProduct', CartController.addProduct);
+router.put('/cart/deleteProduct', CartController.deleteProduct);
+router.get('/cart/find/:client_id', CartController.findByClientId);
+
+export default router;
\ No newline at end of file
diff --git a/restapi/src/routes/OrderRoutes.ts b/restapi/src/routes/OrderRoutes.ts
index 5c7caa6..e90d241 100644
--- a/restapi/src/routes/OrderRoutes.ts
+++ b/restapi/src/routes/OrderRoutes.ts
@@ -15,6 +15,10 @@ router.get('/order/getByCode/:codigo', OrderController.getOrderByCode);
router.get('/order/getByEmail/:email', OrderController.getOrderByEmail);
// Buscar todos los pedidos por correo
router.get('/order/getAllByEmail/:email', OrderController.getTotalUserOrderByEmail);
+// Eliminar por URL
+router.get('/order/delete/:codigo', OrderController.deleteOrder);
+// Calcular costes de envío con easyPost
+router.post("/order/calculateShipment", OrderController.getShippmentCost);
module.exports = router;
diff --git a/restapi/src/routes/ProductRoutes.ts b/restapi/src/routes/ProductRoutes.ts
index 317d3ad..7aa60ed 100644
--- a/restapi/src/routes/ProductRoutes.ts
+++ b/restapi/src/routes/ProductRoutes.ts
@@ -19,5 +19,8 @@ router.get('/product/getByCategoria/:categoria', ProductController.getProductsBy
router.get('/product/getByPrecio/:precio', ProductController.getProductByPrice);
// Productos añadir con Post
router.post('/product/addPost', ProductController.addProductPost);
+// Añadido para que funcione en front
+router.get('/product/getByCodigo/:codigo', ProductController.getProductoByCodigo);
+
module.exports = router;
export default router;
\ No newline at end of file
diff --git a/restapi/src/routes/ReviewRoutes.ts b/restapi/src/routes/ReviewRoutes.ts
new file mode 100644
index 0000000..a529589
--- /dev/null
+++ b/restapi/src/routes/ReviewRoutes.ts
@@ -0,0 +1,16 @@
+const express = require("express");
+import * as ReviewController from '../controllers/ReviewController';
+const router = express.Router();
+
+
+// Añadir una review
+router.post('/review/addReview', ReviewController.addReview);
+// Obtener las reviews de un producto
+router.get('/review/getByCode/:codigo', ReviewController.getReviewsByProduct);
+// Obtener una review concreta
+router.get('/review/getByEmailAndCode/:email/:codigo', ReviewController.getReviewByUserAndProduct);
+// Eliminar una review concreta
+router.get('/review/deleteByEmailAndCode/:email/:codigo', ReviewController.deleteReviewByUserAndProduct);
+
+module.exports = router;
+export default router;
\ No newline at end of file
diff --git a/restapi/src/routes/UserRoutes.ts b/restapi/src/routes/UserRoutes.ts
index a25731b..f51c449 100644
--- a/restapi/src/routes/UserRoutes.ts
+++ b/restapi/src/routes/UserRoutes.ts
@@ -1,19 +1,22 @@
const express = require("express");
import * as UserController from '../controllers/UserController';
+import {validateEmail} from '../middlewares/signupValidator';
const router = express.Router();
router.get('/user/list', UserController.findUsers);
router.get('/user/list/:email', UserController.findUsersByEmail);
-router.post('/user/signup',UserController.createUser);
+router.get('/user/listById/:id', UserController.findUsersById);
+router.post('/user/signup',validateEmail,UserController.createUser);
router.post('/user/login',UserController.loginUser);
router.post('/user/delete/:id',UserController.deleteUser);
router.get('/user/deleteByEmail/:email',UserController.deleteUserByEmail);
-router.post('/user/update/:id',UserController.update);
router.put('/user/update/:id',UserController.update);
router.post('/user/giveAdmin',UserController.giveAdminRole);
router.get('/user/pod/:name',UserController.getUserPOD);
+// Extra
+router.get('/user/findById/:id', UserController.findUsersById);
module.exports=router;
export default router;
\ No newline at end of file
diff --git a/restapi/src/util/apiEasyPost.ts b/restapi/src/util/apiEasyPost.ts
new file mode 100644
index 0000000..1030cea
--- /dev/null
+++ b/restapi/src/util/apiEasyPost.ts
@@ -0,0 +1,62 @@
+const EasyPost = require('@easypost/api');
+
+const api = new EasyPost("EZTK2ca0beef55754d318415e2dcbeb90a67VcDzqAlUplmb0vn0tBoxiQ");
+
+const addressFrom = {
+ "street1": '417 MONTGOMERY ST',
+ "street2": 'FLOOR 5',
+ "city": 'SAN FRANCISCO',
+ "state": 'CA',
+ "zip": '94104',
+ "country": 'US',
+ "company": 'EasyPost',
+ "phone": '415-123-4567',
+ async: true
+};
+
+const parcel = {
+ "length": 8,
+ "width": 5,
+ "height": 5,
+ "weight": 5,
+ async: true
+};
+
+module.exports = async function (addressPod:object){
+
+// Dirección de destido DEL POD
+// Tiene que tener ESTE FORMATO
+
+/**
+var addressTo = {
+ "name": 'Dr. Steve Brule',
+ "street1": '179 N Harbor Dr',
+ "city": 'Redondo Beach',
+ "state": 'CA',
+ "zip": '90277',
+ "country": 'US',
+ "phone": '4155559999',
+};
+*/
+
+var shipment = api.Shipment.create({
+ "from_address": addressFrom,
+ "to_address": addressPod,
+ "parcel": parcel,
+ async : true,
+ status: "200"
+});
+
+return shipment.save().then( (s:any, err: any) => {
+ try {
+ //s.buy(shipment.lowestRate());
+ if (err != null)
+ console.log("Ha ocurrido un error al calcular los gastos de envio: " + err);
+ // Si se busca sólo la cantidad añadir .rate
+ return shipment.lowestRate();
+ } catch(error){
+ return "Ha surgido un error: " + error;
+ }
+});
+}
+
diff --git a/restapi/tests/api.test.ts b/restapi/tests/api.test.ts
deleted file mode 100644
index a7788ec..0000000
--- a/restapi/tests/api.test.ts
+++ /dev/null
@@ -1,397 +0,0 @@
-import request, { Response } from "supertest";
-import express, { Application, RequestHandler } from "express";
-import cors from "cors";
-import bp from "body-parser";
-import { Server } from "http";
-import promBundle from "express-prom-bundle";
-import apiUser from "../src/routes/UserRoutes";
-import apiProduct from "../src/routes/ProductRoutes";
-import apiOrders from "../src/routes/OrderRoutes";
-
-var server: Server;
-
-const app: Application = express();
-
-const mongoose = require("mongoose");
-
-
-beforeAll(async () => {
-
- server = app.listen(5000);
-
- app.use(cors());
- const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
- app.use(metricsMiddleware);
- app.use(bp.json());
- app.use(bp.urlencoded({ extended: false }));
-
- app.use(apiUser);
- app.use(apiProduct);
- app.use(apiOrders);
-
- await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
- {
- useNewUrlParser: true,
- useUnifiedTopology: true
- });
-});
-
-// CONEXIÓN A LA BD
-
-afterAll(async () => {
- server.close();
- await mongoose.connection.close();
- // Cuidado con lo que se ponga aquí, que puede afectar a la BD
-});
-
-
-/******* USUARIOS *******/
-
-describe("user ", () => {
- /**
- * Consigo un usuario
- */
- it("Puedo conseguir un usuario", async () => {
- const response: Response = await request(app).get(
- "/user/list/user3@uniovi.es"
- );
- expect(response.statusCode).toBe(200);
- expect(response.body).toEqual(
- expect.objectContaining({
- name: "Usuario 3",
- surname: "Usuario3",
- email: "user3@uniovi.es",
- })
- );
- });
-
- /**
- * No puedo conseguir un usuario no existente
- */
- it("No puedo conseguir un usuario no existente", async () => {
- const response: Response = await request(app).get(
- "/user/list/something"
- );
- expect(response.statusCode).toBe(204);
- });
-
- /**
- * Puedo listar a todos los usuarios
- */
- it("Puedo listar a todos los usuarios", async () => {
- const response: Response = await request(app).get(
- "/user/list"
- );
- expect(response.statusCode).toBe(200);
- });
-
-
- /**
- * Creo un usuario de forma correcta
- */
- it("Creo un usuario de forma correcta", async () => {
- const response: Response = await request(app).post("/user/signup").send({
- name: "prueba",
- surname: "prueba",
- email: "usuarioPrueba@gmail.com",
- password: "prueba",
- repPassword: "prueba",
- role: "user",
- });
- expect(response.statusCode).toBe(201);
- });
-
- /**
- * Borro el usuario que acabo de crear por el email
- */
- it("Borro el usuario que acabo de crear por el email", async () => {
- const response: Response = await request(app).get(
- "/user/deleteByEmail/usuarioPrueba@gmail.com"
- );
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * Intento borrar un usuario con un ID que no existe
- */
- it("Intento borrar un usuario con un ID que no existe", async () => {
- const response: Response = await request(app).post("/user/delete").send({
- id: "IDFALSO"
- });
- expect(response.statusCode).toBe(404);
- });
-
- // LOGIN
-
- /**
- * Hago login de forma correcta
- */
- it("Hago login de forma correcta", async () => {
- const response: Response = await request(app).post("/user/login").send({
- email: "user@uniovi.es",
- password: "user123",
- });
- expect(response.statusCode).toBe(200);
- });
-
-
- /**
- * Encuentro el POD de un usuario de forma correcta
- */
- it("Encuentro el POD de un usuario de forma correcta", async () => {
- const response: Response = await request(app).get(
- "/user/pod/uo278290"
- );
-
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * Fallo al encontrar el POD
- */
- it("No encuentro el POD de un usuario", async () => {
- const response: Response = await request(app).get(
- "/user/pod/noExiste"
- );
- expect(response.statusCode).toBe(404);
- });
-
- /**
- * Intento actualizar un usuario no existente
- */
- it("Intento actualizar un usuario no existente", async () => {
- const response: Response = await request(app).post("/user/delete").send({
- id: "IDFALSO"
- });
- expect(response.statusCode).toBe(404);
- });
-});
-
-
-
-/******* PRODUCTOS *******/
-
-describe("products ", () => {
-
- /**
- * Consigo un producto buscando por código
- */
- it("Puedo conseguir un producto buscando por código", async () => {
- const response: Response = await request(app).get(
- "/product/getByCode/MO01"
- );
- expect(response.statusCode).toBe(200);
- expect(response.body).toEqual(
- expect.objectContaining({
- codigo: "MO01",
- categoria: "monitor",
- nombre: "Samsung LF27T352FHRXEN",
- precio: 139.99,
- stock: 20,
- descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
- url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg",
- })
- );
- });
-
- /**
- * No puedo conseguir un producto no existente buscando por código
- */
- it("No puedo conseguir un producto no existente buscando por código", async () => {
- const response: Response = await request(app).get(
- "/product/getByCode/productDoesNotExists"
- );
- expect(response.statusCode).toBe(204);
- });
-
- /**
- * Puedo listar a todos los productos
- */
- it("Puedo listar a todos los productos", async () => {
- const response: Response = await request(app).get(
- "/product/list"
- );
- expect(response.statusCode).toBe(200);
- expect(response.type).toEqual("application/json");
- });
-
-
- /**
- * Busco un producto por una categoría
- */
- it("Consigo un producto buscando por categoria", async () => {
- const response: Response = await request(app).get(
- "/product/getByCategoria/teclado"
- );
- expect(response.statusCode).toBe(200);
- });
-
-
- /**
- * Busco un producto por un precio inexistente
- */
- it("Busco un producto por un precio inexistente", async () => {
- const response: Response = await request(app).get(
- "/product/getByPrecio/0.00"
- );
- expect(response.statusCode).toBe(404);
- });
-
-
- /**
- * Creo un producto
- */
- it("Puedo crear un producto correctamente", async () => {
- const response: Response = await request(app).post("/product/addPost").send({
- codigo: "codigoPrueba",
- categoria: "categoriaPrueba",
- nombre: "productoPrueba",
- precio: 10,
- stock: 10,
- descripcion: "producto de prueba",
- url: "url de prueba",
- });
- expect(response.statusCode).toBe(201);
- });
-
-
- /**
- * Intento crear el mismo producto
- */
- it("No puedo crear un producto con el mismo código", async () => {
- const response: Response = await request(app).post("/product/addPost").send({
- codigo: "codigoPrueba",
- categoria: "categoriaPrueba",
- nombre: "productoPrueba",
- precio: 10,
- stock: 10,
- descripcion: "producto de prueba",
- url: "url de prueba",
- });
- expect(response.statusCode).toBe(409);
- });
-
- /**
- * Intento crear el producto sin que tenga todos los campos
- */
- it("Intento crear el producto sin que tenga todos los campos", async () => {
- const response: Response = await request(app).post("/product/addPost").send({
- precio: 10,
- stock: 10,
- descripcion: "producto de prueba",
- url: "url de prueba",
- });
- expect(response.statusCode).toBe(412);
- });
-
- /**
- * Actualizo el producto que acabo de añadir
- */
- it("Actualizo el producto que acabo de añadir", async () => {
- const response: Response = await request(app).get(
- "/product/update/codigoPrueba/?nombre=nombreCambiado"
- );
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * Borro el producto que acabo de añadir
- */
- it("Borro el producto que acabo de añadir", async () => {
- const response: Response = await request(app).get(
- "/product/delete/codigoPrueba"
- );
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * Creo el producto de ejemplo
- */
- it("Creo el producto de ejemplo", async () => {
- const response: Response = await request(app).get(
- "/product/generateExample"
- );
- expect(response.statusCode).toBe(201);
- });
-
- /**
- * Borro el producto de ejemplo
- */
- it("Borro el producto de ejemplo", async () => {
- const response: Response = await request(app).get(
- "/product/delete/codeExample"
- );
- expect(response.statusCode).toBe(200);
- });
-
-
-});
-
-
-/******* PEDIDOS *******/
-
-describe("orders ", () => {
- /**
- * Consigo un pedido
- */
- it("Puedo conseguir un pedido", async () => {
- const response: Response = await request(app).get(
- "/order/getByCode/orderTwoExample"
- );
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * No puedo conseguir un pedido no existente
- */
- it("No puedo conseguir un pedido no existente", async () => {
- const response: Response = await request(app).get(
- "/order/getByCode/orderDoesNotExists"
- );
- expect(response.statusCode).toBe(204);
- });
-
-
- /**
- * Consigo un pedido pasando un email
- */
- it("Puedo conseguir un pedido pasando un email", async () => {
- const response: Response = await request(app).get(
- "/order/getByEmail/admin@uniovi.es"
- );
- expect(response.statusCode).toBe(200);
- });
-
- /**
- * No puedo conseguir un pedido no existente pasando el email
- */
- it("No puedo conseguir un pedido no existente", async () => {
- const response: Response = await request(app).get(
- "/order/getByEmail/emailNotExists"
- );
- expect(response.statusCode).toBe(204);
- });
-
- /**
- * Consigo todos los pedidos del usuario
- */
- it("Puedo conseguir todos los pedidos del usuario pasando un email", async () => {
- const response: Response = await request(app).get(
- "/order/getAllByEmail/admin@uniovi.es"
- );
- expect(response.statusCode).toBe(200);
- });
-
-
- /**
- * Puedo listar a todos los pedidos
- */
- it("Puedo listar a todos los pedidos", async () => {
- const response: Response = await request(app).get(
- "/order/list"
- );
- expect(response.statusCode).toBe(200);
- expect(response.type).toEqual("application/json");
- });
-
-});
\ No newline at end of file
diff --git a/restapi/tests/cart.test.ts b/restapi/tests/cart.test.ts
new file mode 100644
index 0000000..d86f380
--- /dev/null
+++ b/restapi/tests/cart.test.ts
@@ -0,0 +1,301 @@
+import request, { Response } from "supertest";
+import express, { Application, RequestHandler } from "express";
+import bp from "body-parser";
+import { Server } from "http";
+import promBundle from "express-prom-bundle";
+import apiCarts from "../src/routes/CartRoutes";
+
+var server: Server;
+
+const app: Application = express();
+
+const mongoose = require("mongoose");
+
+
+beforeAll(async () => {
+
+ server = app.listen(5000);
+
+ const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
+ app.use(metricsMiddleware);
+ app.use(bp.json());
+ app.use(bp.urlencoded({ extended: false }));
+
+ app.use(apiCarts);
+
+ await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
+ {
+ useNewUrlParser: true,
+ useUnifiedTopology: true
+ });
+});
+
+// CONEXIÓN A LA BD
+
+afterAll(async () => {
+ server.close();
+ await mongoose.connection.close();
+ // Cuidado con lo que se ponga aquí, que puede afectar a la BD
+});
+
+
+
+
+
+/******* CARRITO *******/
+
+describe("carts ", () => {
+
+
+ // Si hago esto me va a fallar porque no hay un método para "deshacer" el carro
+
+
+ /**
+ it("Creo un nuevo carro vacío", async () => {
+ const response: Response = await request(app).post("/cart/add").send({
+ client_id:"62436970ce933f737bdebb2a",
+ });
+
+ expect(response.statusCode).toBe(201);
+ });
+ **/
+
+
+
+ /**
+ * Intento crear un carro de un usuario existente
+ */
+ it("Intento crear un carro de un usuario existente", async () => {
+ const response: Response = await request(app).post("/cart/add").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ });
+
+ expect(response.statusCode).toBe(400);
+ });
+
+ /**
+ * Intento crear un carro de un usuario no existente
+ */
+ it("Intento crear un carro de un usuario no existente", async () => {
+ const response: Response = await request(app).post("/cart/add").send({
+ client_id:"624364bdb14f7ce93ddae733",
+ });
+
+ expect(response.statusCode).toBe(404);
+ });
+
+ /**
+ * Intento crear un carro sin pasar información
+ */
+ it("Intento crear un carro sin pasar información", async () => {
+ const response: Response = await request(app).post("/cart/add").send({
+ });
+
+ expect(response.statusCode).toBe(404);
+ });
+
+
+
+ /**
+ * Añado un producto al carro
+ */
+ it("Añado un producto al carro ", async () => {
+ const response: Response = await request(app).put("/cart/addProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ }
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Añado el mismo producto al carro
+ */
+ it("Añado el mismo producto al carro ", async () => {
+ const response: Response = await request(app).put("/cart/addProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ }
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento añadir un producto pasando mal el usuario
+ */
+ it("Intento añadir un producto pasando mal el usuario ", async () => {
+ const response: Response = await request(app).put("/cart/addProduct").send({
+ client_id:"fallo",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ }
+ });
+ expect(response.statusCode).toBe(400);
+ });
+
+ /**
+ * Añado otro producto distinto más al carro
+ */
+ it("Añado otro producto distinto más al carro ", async () => {
+ const response: Response = await request(app).put("/cart/addProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "SO01",
+ categoria: "sonido",
+ nombre: "Hama Sonic LS-206 6W",
+ precio: 9.87,
+ descripcion: "Negro, Plata Altavoz - Altavoces (2.0 Canales, 6 W, 50-20000 Hz, 4 Ω, Negro, Plata) ",
+ stock: 1,
+ url: "https://i.postimg.cc/SNJX72mp/AL01.jpg"
+ }
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Borro el producto del carro
+ */
+ it("Borro el producto del carro", async () => {
+ const response: Response = await request(app).put("/cart/deleteProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ },
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Borro otra vez el producto repetido del carro
+ */
+ it("Borro otra vez el producto repetido del carro", async () => {
+ const response: Response = await request(app).put("/cart/deleteProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ },
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento borrar pasando mal el usuario
+ */
+ it("Borro el producto del carro", async () => {
+ const response: Response = await request(app).put("/cart/deleteProduct").send({
+ client_id:"fallo",
+ product:
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ },
+ });
+ expect(response.statusCode).toBe(400);
+ });
+
+
+ /**
+ * Borro el otro producto del carro
+ */
+ it("Borro el otro producto del carro", async () => {
+ const response: Response = await request(app).put("/cart/deleteProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ codigo: "SO01",
+ categoria: "sonido",
+ nombre: "Hama Sonic LS-206 6W",
+ precio: 9.87,
+ descripcion: "Negro, Plata Altavoz - Altavoces (2.0 Canales, 6 W, 50-20000 Hz, 4 Ω, Negro, Plata) ",
+ stock: 1,
+ url: "https://i.postimg.cc/SNJX72mp/AL01.jpg"
+ }
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento borrar un producto vacio
+ */
+ it("Intento borrar un carro vacío", async () => {
+ const response: Response = await request(app).put("/cart/deleteProduct").send({
+ client_id:"624364bdb14f7ce93ddae736",
+ product:
+ {
+ }
+ });
+ expect(response.statusCode).toBe(200);
+});
+
+
+ /**
+ * Busco el carro de un cliente
+ */
+ it("Puedo conseguir un pedido", async () => {
+ const response: Response = await request(app).get(
+ "/cart/find/624364bdb14f7ce93ddae736"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * No encuentro el carro de un cliente no existente
+ */
+ it("No encuentro el carro de un cliente no existente", async () => {
+ const response: Response = await request(app).get(
+ "/cart/find/624364bdb14f7ce93ddae733"
+ );
+ expect(response.statusCode).toBe(404);
+ });
+
+
+ });
\ No newline at end of file
diff --git a/restapi/tests/order.test.ts b/restapi/tests/order.test.ts
new file mode 100644
index 0000000..a26fa87
--- /dev/null
+++ b/restapi/tests/order.test.ts
@@ -0,0 +1,228 @@
+import request, { Response } from "supertest";
+import express, { Application, RequestHandler } from "express";
+import bp from "body-parser";
+import { Server } from "http";
+import promBundle from "express-prom-bundle";
+import apiOrders from "../src/routes/OrderRoutes";
+
+var server: Server;
+
+const app: Application = express();
+
+const mongoose = require("mongoose");
+
+
+beforeAll(async () => {
+
+ server = app.listen(5000);
+
+ const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
+ app.use(metricsMiddleware);
+ app.use(bp.json());
+ app.use(bp.urlencoded({ extended: false }));
+
+ app.use(apiOrders);
+
+ await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
+ {
+ useNewUrlParser: true,
+ useUnifiedTopology: true
+ });
+});
+
+// CONEXIÓN A LA BD
+
+afterAll(async () => {
+ server.close();
+ await mongoose.connection.close();
+ // Cuidado con lo que se ponga aquí, que puede afectar a la BD
+});
+
+
+
+
+/******* PEDIDOS *******/
+
+describe("orders ", () => {
+
+ /**
+ * Creo un nuevo pedido
+ */
+ it("Puedo crear un nuevo pedido correctamente", async () => {
+ const response: Response = await request(app).post("/order/addOrder").send({
+ codigo: "orderPrueba",
+ correo: "correoPrueba",
+ direccion: "dirPrueba",
+ fecha: new Date(),
+ products: [
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ },
+
+ {
+ codigo: "SO01",
+ categoria: "sonido",
+ nombre: "Hama Sonic LS-206 6W",
+ precio: 9.87,
+ descripcion: "Negro, Plata Altavoz - Altavoces (2.0 Canales, 6 W, 50-20000 Hz, 4 Ω, Negro, Plata) ",
+ stock: 1,
+ url: "https://i.postimg.cc/SNJX72mp/AL01.jpg"
+ }
+ ]
+ });
+
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * No puedo crear un pedido al que le falten campos
+ */
+ it("No puedo crear un pedido al que le falten campos ", async () => {
+ const response: Response = await request(app).post("/order/addOrder").send({
+ codigo: "orderNegativa",
+ correo: "correoNegativo",
+ products: [
+ {
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ stock:2,
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg"
+ }
+ ]
+ });
+ expect(response.statusCode).toBe(412);
+ });
+
+
+ /**
+ * Borro el pedido que acabo de crear
+ */
+ it("Borro el pedido que acabo de crear", async () => {
+ const response: Response = await request(app).get(
+ "/order/delete/orderPrueba"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Intento borrar un pedido pasando un codigo no existente
+ */
+ it("Intento borrar un pedido pasando un codigo no existente", async () => {
+ const response: Response = await request(app).get(
+ "/order/delete/fallo"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+
+
+ /**
+ * Consigo un pedido
+ */
+ it("Puedo conseguir un pedido", async () => {
+ const response: Response = await request(app).get(
+ "/order/getByCode/orderTwoExample"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * No puedo conseguir un pedido no existente
+ */
+ it("No puedo conseguir un pedido no existente", async () => {
+ const response: Response = await request(app).get(
+ "/order/getByCode/orderDoesNotExists"
+ );
+ expect(response.statusCode).toBe(204);
+ });
+
+
+ /**
+ * Consigo un pedido pasando un email
+ */
+ it("Puedo conseguir un pedido pasando un email", async () => {
+ const response: Response = await request(app).get(
+ "/order/getByEmail/admin@uniovi.es"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * No puedo conseguir un pedido no existente pasando el email
+ */
+ it("No puedo conseguir un pedido no existente", async () => {
+ const response: Response = await request(app).get(
+ "/order/getByEmail/emailNotExists"
+ );
+ expect(response.statusCode).toBe(204);
+ });
+
+ /**
+ * Consigo todos los pedidos del usuario
+ */
+ it("Puedo conseguir todos los pedidos del usuario pasando un email", async () => {
+ const response: Response = await request(app).get(
+ "/order/getAllByEmail/admin@uniovi.es"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Puedo listar a todos los pedidos
+ */
+ it("Puedo listar a todos los pedidos", async () => {
+ const response: Response = await request(app).get(
+ "/order/list"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.type).toEqual("application/json");
+ });
+
+
+ /**
+ * Creo la orden de ejemplo
+ */
+ it("Creo la orden de ejemplo", async () => {
+ const response: Response = await request(app).get(
+ "/order/generateExample"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Borro la orden de ejemplo
+ */
+ it("Borro la orden de ejemplo", async () => {
+ const response: Response = await request(app).get(
+ "/order/delete/orderXExample"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Hallo los costes de envío de una dirección determinada
+ */
+ it("Hallo los costes de envío de una dirección determinada ", async () => {
+ const response: Response = await request(app).post("/order/calculateShipment").send({
+ name: 'Dr. Steve Brule',
+ street1: '179 N Harbor Dr',
+ city: 'Redondo Beach',
+ state: 'CA',
+ zip: '90277',
+ country: 'US',
+ phone: '4155559999'
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+ });
\ No newline at end of file
diff --git a/restapi/tests/product.test.ts b/restapi/tests/product.test.ts
new file mode 100644
index 0000000..eab0d0b
--- /dev/null
+++ b/restapi/tests/product.test.ts
@@ -0,0 +1,278 @@
+import request, { Response } from "supertest";
+import express, { Application, RequestHandler } from "express";
+import bp from "body-parser";
+import { Server } from "http";
+import promBundle from "express-prom-bundle";
+import apiProduct from "../src/routes/ProductRoutes";
+
+var server: Server;
+
+const app: Application = express();
+
+const mongoose = require("mongoose");
+
+
+beforeAll(async () => {
+
+ server = app.listen(5000);
+
+ const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
+ app.use(metricsMiddleware);
+ app.use(bp.json());
+ app.use(bp.urlencoded({ extended: false }));
+
+ app.use(apiProduct);
+
+ await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
+ {
+ useNewUrlParser: true,
+ useUnifiedTopology: true
+ });
+});
+
+// CONEXIÓN A LA BD
+
+afterAll(async () => {
+ server.close();
+ await mongoose.connection.close();
+ // Cuidado con lo que se ponga aquí, que puede afectar a la BD
+});
+
+
+
+/******* PRODUCTOS *******/
+
+describe("products ", () => {
+
+ // Con el primer getByCode
+
+ /**
+ * Consigo un producto buscando por código
+ */
+ it("Puedo conseguir un producto buscando por código", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCode/MO01"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.body).toEqual(
+ expect.objectContaining({
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg",
+ })
+ );
+ });
+
+ /**
+ * No puedo conseguir un producto no existente buscando por código
+ */
+ it("No puedo conseguir un producto no existente buscando por código", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCode/productDoesNotExists"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+
+ // Con el segundo getByCode que por alguna razón funciona en front y el anterior no
+
+ /**
+ * Consigo un producto buscando por código
+ */
+ it("Puedo conseguir un producto buscando por código", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCodigo/MO01"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.body).toEqual(
+ expect.objectContaining({
+ codigo: "MO01",
+ categoria: "monitor",
+ nombre: "Samsung LF27T352FHRXEN",
+ precio: 139.99,
+ descripcion: "Monitor Plano de 27'', Full HD (1080p, Panel IPS), Freesync, HDMI, Gaming, Negro",
+ url: "https://i.postimg.cc/sgWvqkB6/MO01.jpg",
+ })
+ );
+ });
+
+ /**
+ * No puedo conseguir un producto no existente buscando por código
+ */
+ it("No puedo conseguir un producto no existente buscando por código", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCodigo/productDoesNotExists"
+ );
+ expect(response.statusCode).toBe(404);
+ });
+
+ /**
+ * Puedo listar a todos los productos
+ */
+ it("Puedo listar a todos los productos", async () => {
+ const response: Response = await request(app).get(
+ "/product/list"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.type).toEqual("application/json");
+ });
+
+
+ /**
+ * Busco un producto por una categoría
+ */
+ it("Consigo un producto buscando por categoria", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCategoria/teclado"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento buscar un producto por una categoría no existente
+ */
+ it("Intento buscar un producto por una categoría no existente", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByCategoria/ERROR"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+
+ /**
+ * Busco un producto por un precio que exista
+ */
+ it("Busco un producto por un precio que exista", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByPrecio/15.99"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+
+ /**
+ * Busco un producto por un precio inexistente
+ */
+ it("Busco un producto por un precio inexistente", async () => {
+ const response: Response = await request(app).get(
+ "/product/getByPrecio/0.00"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+
+ /**
+ * Creo un producto
+ */
+ it("Puedo crear un producto correctamente", async () => {
+ const response: Response = await request(app).post("/product/addPost").send({
+ codigo: "codigoPrueba",
+ categoria: "categoriaPrueba",
+ nombre: "productoPrueba",
+ precio: 10,
+ stock: 10,
+ descripcion: "producto de prueba",
+ url: "url de prueba",
+ });
+ expect(response.statusCode).toBe(201);
+ expect(response.body.prod.nombre).toBe("productoPrueba");
+ });
+
+
+ /**
+ * Intento crear el mismo producto
+ */
+ it("No puedo crear un producto con el mismo código", async () => {
+ const response: Response = await request(app).post("/product/addPost").send({
+ codigo: "codigoPrueba",
+ categoria: "categoriaPrueba",
+ nombre: "productoPrueba",
+ precio: 10,
+ stock: 10,
+ descripcion: "producto de prueba",
+ url: "url de prueba",
+ });
+ expect(response.statusCode).toBe(409);
+ });
+
+
+ /**
+ * Intento crear el producto sin que tenga todos los campos
+ */
+ it("Intento crear el producto sin que tenga todos los campos", async () => {
+ const response: Response = await request(app).post("/product/addPost").send({
+ precio: 10,
+ stock: 10,
+ descripcion: "productoIncompleto",
+ url: "urlIncompleta",
+ });
+ expect(response.statusCode).toBe(412);
+ });
+
+ /**
+ * Actualizo el producto que acabo de añadir
+ */
+ it("Actualizo el producto que acabo de añadir", async () => {
+ const response: Response = await request(app).get(
+ "/product/update/codigoPrueba/?nombre=nombreCambiado"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento actualizar un producto inexistente
+ */
+ it(" Intento actualizar un producto inexistente", async () => {
+ const response: Response = await request(app).get(
+ "/product/update/noExisto/?nombre=nombreCambiado"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+ /**
+ * Borro el producto que acabo de añadir
+ */
+ it("Borro el producto que acabo de añadir", async () => {
+ const response: Response = await request(app).get(
+ "/product/delete/codigoPrueba"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento borrar un producto inexistente
+ */
+ it("Intento borrar un producto inexistente", async () => {
+ const response: Response = await request(app).get(
+ "/product/delete/fallo"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+ /**
+ * Creo el producto de ejemplo
+ */
+ it("Creo el producto de ejemplo", async () => {
+ const response: Response = await request(app).get(
+ "/product/generateExample"
+ );
+ expect(response.statusCode).toBe(201);
+ });
+
+ /**
+ * Borro el producto de ejemplo
+ */
+ it("Borro el producto de ejemplo", async () => {
+ const response: Response = await request(app).get(
+ "/product/delete/codeExample"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+ });
\ No newline at end of file
diff --git a/restapi/tests/review.test.ts b/restapi/tests/review.test.ts
new file mode 100644
index 0000000..a09a404
--- /dev/null
+++ b/restapi/tests/review.test.ts
@@ -0,0 +1,130 @@
+import request, { Response } from "supertest";
+import express, { Application, RequestHandler } from "express";
+import bp from "body-parser";
+import { Server } from "http";
+import promBundle from "express-prom-bundle";
+import apiReviews from "../src/routes/ReviewRoutes"
+
+var server: Server;
+
+const app: Application = express();
+
+const mongoose = require("mongoose");
+
+
+beforeAll(async () => {
+
+ server = app.listen(5000);
+
+ const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
+ app.use(metricsMiddleware);
+ app.use(bp.json());
+ app.use(bp.urlencoded({ extended: false }));
+
+ app.use(apiReviews)
+
+ await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
+ {
+ useNewUrlParser: true,
+ useUnifiedTopology: true
+ });
+});
+
+// CONEXIÓN A LA BD
+
+afterAll(async () => {
+ server.close();
+ await mongoose.connection.close();
+ // Cuidado con lo que se ponga aquí, que puede afectar a la BD
+});
+
+
+describe("reviews", () => {
+
+
+ /**
+ * Puedo crear una review
+ */
+ it("Puedo crear una review ", async () => {
+ const response: Response = await request(app).post("/review/addReview").send({
+ score: 7,
+ comment: "Pretty nice but a little bit expensive",
+ authorEmail: "email@prueba.es",
+ productCode: "RA01",
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Obtengo la review que acabo de añadir
+ */
+ it("Obtengo la review que acabo de añadir", async () => {
+ const response: Response = await request(app).get(
+ "/review/getByEmailAndCode/email@prueba.es/RA01"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.type).toEqual("application/json");
+ });
+
+
+
+
+
+ /**
+ * Consigo todas las reviews de un producto
+ */
+ it("Consigo todas las reviews de un producto", async () => {
+ const response: Response = await request(app).get(
+ "/review/getByCode/RA011"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.type).toEqual("application/json");
+ });
+
+ /**
+ * Busco las reviews de un producto asociado a un usuario que NO existe
+ */
+ it("Busco las reviews de un producto asociado a un usuario que NO existe", async () => {
+ const response: Response = await request(app).get(
+ "/review/getByEmailAndCode/fallo/fallo"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+ /**
+ * No puedo crear una review a la que le falte información
+ */
+ it("No puedo crear una review a la que le falte información", async () => {
+ const response: Response = await request(app).post("/review/addReview").send({
+ score: 7,
+ comment: "Pretty nice but a little bit expensive",
+ authorEmail: "email@prueba.es",
+ });
+ expect(response.statusCode).toBe(412);
+ expect(response.body.message).toBe("Can't register that review, is not valid");
+ });
+
+
+ /**
+ * Borro la review que he creado antes
+ */
+ it("Borro la review que he creado antes", async () => {
+ const response: Response = await request(app).get(
+ "/review/deleteByEmailAndCode/email@prueba.es/RA01"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento borrar una review no existente
+ */
+ it("Intento borrar una review no existente", async () => {
+ const response: Response = await request(app).get(
+ "/review/deleteByEmailAndCode/fallo/fallo"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+});
+
+
\ No newline at end of file
diff --git a/restapi/tests/user.test.ts b/restapi/tests/user.test.ts
new file mode 100644
index 0000000..56da408
--- /dev/null
+++ b/restapi/tests/user.test.ts
@@ -0,0 +1,280 @@
+import request, { Response } from "supertest";
+import express, { Application, RequestHandler } from "express";
+import bp from "body-parser";
+import { Server } from "http";
+import promBundle from "express-prom-bundle";
+import apiUser from "../src/routes/UserRoutes";
+
+
+function makeid() {
+ return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+}
+
+function admin() {
+ return "admin123";
+ }
+
+var server: Server;
+
+const app: Application = express();
+
+const mongoose = require("mongoose");
+
+const passwordTest = makeid();
+
+
+beforeAll(async () => {
+
+ server = app.listen(5000);
+ const metricsMiddleware: RequestHandler = promBundle({ includeMethod: true });
+ app.use(metricsMiddleware);
+ app.use(bp.json());
+ app.use(bp.urlencoded({ extended: false }));
+
+ app.use(apiUser);
+
+
+
+ await mongoose.connect('mongodb+srv://admin:es2c@cluster0.tx3d4.mongodb.net/TestDataBase?retryWrites=true&w=majority',
+ {
+ useNewUrlParser: true,
+ useUnifiedTopology: true
+ });
+});
+
+// CONEXIÓN A LA BD
+
+afterAll(async () => {
+ server.close();
+ await mongoose.connection.close();
+ // Cuidado con lo que se ponga aquí, que puede afectar a la BD
+});
+
+
+
+/******* USUARIOS *******/
+
+describe("user ", () => {
+ /**
+ * Consigo un usuario
+ */
+ it("Puedo conseguir un usuario", async () => {
+ const response: Response = await request(app).get(
+ "/user/list/user3@uniovi.es"
+ );
+ expect(response.statusCode).toBe(200);
+ expect(response.body).toEqual(
+ expect.objectContaining({
+ name: "Usuario 3",
+ surname: "Usuario3",
+ email: "user3@uniovi.es",
+ })
+ );
+ });
+
+ /**
+ * No puedo conseguir un usuario no existente
+ */
+ it("No puedo conseguir un usuario no existente", async () => {
+ const response: Response = await request(app).get(
+ "/user/list/something"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+
+ /**
+ * Puedo listar a todos los usuarios
+ */
+ it("Puedo listar a todos los usuarios", async () => {
+ const response: Response = await request(app).get(
+ "/user/list"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Busco a un usuario por su ID
+ */
+ it("Busco a un usuario por su ID", async () => {
+ const response: Response = await request(app).get(
+ "/user/findById/6243643891563b010abbb654"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+
+
+ /**
+ * Creo un usuario de forma correcta
+ */
+ it("Creo un usuario de forma correcta", async () => {
+
+ const response: Response = await request(app).post("/user/signup").send({
+ name: "prueba",
+ surname: "prueba",
+ email: "usuarioPrueba@gmail.com",
+ password: passwordTest,
+ repPassword: passwordTest,
+ role: "user",
+ });
+
+ expect(response.statusCode).toBe(201);
+ });
+
+ /**
+ * Actualizo el usuario que acabo de crear
+ */
+ it("Actualizo el usuario que acabo de crear", async () => {
+ // Esto funciona porque miré la ID en Mongo
+ const response: Response = await request(app).put("/user/update/62446b22fce44aae56859b86").send({
+ name: "nombreCambiado",
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Vuelvo a actualizar al usuario dejándolo como estaba
+ */
+ it("Vuelvo a actualizar al usuario dejándolo como estaba", async () => {
+ const response: Response = await request(app).put("/user/update/62446b22fce44aae56859b86").send({
+ name: "Usuario 3",
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Intento actualizar un usuario empleando un ID con un formato no válido
+ */
+ it("Intento actualizar un usuario no existente", async () => {
+ // Esto funciona porque miré la ID en Mongo
+ const response: Response = await request(app).put("/user/update/formatoNoValido").send({
+ name: "nombreCambiado",
+ });
+ expect(response.statusCode).toBe(404);
+ });
+
+
+
+ /**
+ * Intento crear un usuario con un correo ya existente
+ */
+ it("Intento crear un usuario con un correo ya existente ", async () => {
+ const response: Response = await request(app).post("/user/signup").send({
+ name: "prueba",
+ surname: "prueba",
+ email: "usuarioPrueba@gmail.com",
+ password: passwordTest,
+ repPassword: passwordTest,
+ role: "user",
+ });
+ expect(response.statusCode).toBe(400);
+ });
+
+
+ /**
+ * Borro el usuario que acabo de crear por el email
+ */
+ it("Borro el usuario que acabo de crear por el email", async () => {
+ const response: Response = await request(app).get(
+ "/user/deleteByEmail/usuarioPrueba@gmail.com"
+ );
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Intento borrar un usuario con un ID que no existe
+ */
+ it("Intento borrar un usuario con un ID que no existe", async () => {
+ const response: Response = await request(app).post("/user/delete/").send({
+ id: "IDFALSO"
+ });
+ expect(response.statusCode).toBe(404);
+ });
+
+
+ /**
+ * Intento dar privilegios de admin pero no puedo porque los tokens los manejan desde el front
+ */
+ it("Intento dar privilegios de admin pero no puedo porque los tokens los manejan desde el front", async () => {
+ const response: Response = await request(app).post("/user/giveAdmin").send({
+ id: "624736af129ec63aae8e376c"
+ });
+ expect(response.statusCode).toBe(404);
+ });
+
+
+ /**
+ * Intento dar privilegios de admin a un usuario no existente
+ */
+ it("Intento dar privilegios de admin a un usuario no existente", async () => {
+ const response: Response = await request(app).post("/user/giveAdmin").send({
+ id: "noExisto"
+ });
+ expect(response.statusCode).toBe(404);
+ });
+
+
+
+
+ /**
+ * Intento hacer login desde aquí pero no puedo porque manejan tokens desde el front
+ */
+ it("Intento hacer login desde aquí pero no puedo porque manejan tokens desde el front", async () => {
+ const response: Response = await request(app).post("/user/login").send({
+ email: "admin@uniovi.es",
+ password: admin(),
+ });
+ expect(response.statusCode).toBe(404);
+ });
+
+
+
+ /**
+ * Intento hacer login y falla por poner mal la contraseña
+ */
+ it("Intento hacer login y falla por poner mal la contraseña", async () => {
+ const response: Response = await request(app).post("/user/login").send({
+ email: "admin@uniovi.es",
+ password: makeid(),
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+ /**
+ * Hago login de forma incorrecta
+ */
+ it("Hago login de forma incorrecta", async () => {
+ const response: Response = await request(app).post("/user/login").send({
+ email: "correoInexistente",
+ password: passwordTest,
+ });
+ expect(response.statusCode).toBe(200);
+ });
+
+
+ /**
+ * Encuentro el POD de un usuario de forma correcta
+ */
+ it("Encuentro el POD de un usuario de forma correcta", async () => {
+ const response: Response = await request(app).get(
+ "/user/pod/uo278290"
+ );
+
+ expect(response.statusCode).toBe(200);
+ expect(response.body.street_address).toBe("El Fondaque 67");
+ });
+
+ /**
+ * Fallo al encontrar el POD
+ */
+ it("No encuentro el POD de un usuario", async () => {
+ const response: Response = await request(app).get(
+ "/user/pod/noExiste"
+ );
+ expect(response.statusCode).toBe(412);
+ });
+
+});
\ No newline at end of file
diff --git a/webapp/Dockerfile b/webapp/Dockerfile
index ebcd7e2..c76be65 100644
--- a/webapp/Dockerfile
+++ b/webapp/Dockerfile
@@ -5,6 +5,12 @@ WORKDIR /app
#Install the dependencies
RUN npm install
+ARG REACT_APP_API_URI="http://localhost:5000"
+ENV REACT_APP_API_URI=$REACT_APP_API_URI
+
+ARG REACT_APP_URI="http://localhost:3000"
+ENV REACT_APP_URI_URI=$REACT_APP_URI
+
#Create an optimized version of the webapp
RUN npm run build
diff --git a/webapp/UserContext.ts b/webapp/UserContext.ts
deleted file mode 100644
index cab0f68..0000000
--- a/webapp/UserContext.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { createContext } from "react";
-
-export const UserContext = createContext(null);
\ No newline at end of file
diff --git a/webapp/e2e/features/AddProduct.feature b/webapp/e2e/features/AddProduct.feature
new file mode 100644
index 0000000..cf5a6e8
--- /dev/null
+++ b/webapp/e2e/features/AddProduct.feature
@@ -0,0 +1,6 @@
+Feature: Add new products
+
+Scenario: The user adds new products to the car
+ Given An existing user
+ When I log in and press the button to add my products
+ Then They should be in the cart
\ No newline at end of file
diff --git a/webapp/e2e/features/DeleteProduct.feature b/webapp/e2e/features/DeleteProduct.feature
new file mode 100644
index 0000000..040f699
--- /dev/null
+++ b/webapp/e2e/features/DeleteProduct.feature
@@ -0,0 +1,6 @@
+Feature: Delete product
+
+Scenario: The user deletes a product
+ Given An existing user
+ When I log in and want to delete the product I add
+ Then I should be able to delete the product
\ No newline at end of file
diff --git a/webapp/e2e/features/Login.feature b/webapp/e2e/features/Login.feature
new file mode 100644
index 0000000..c326c92
--- /dev/null
+++ b/webapp/e2e/features/Login.feature
@@ -0,0 +1,12 @@
+Feature: Login an user on the website
+
+Scenario: The user is registered in the website
+ Given An existing user
+ When I fill the data in the form
+ Then I should see the correct page
+
+
+Scenario: Incorrect login from a non existing user
+ Given A non existing user
+ When I fill the data in the form
+ Then I should see an error in the page
diff --git a/webapp/e2e/features/Order.feature b/webapp/e2e/features/Order.feature
new file mode 100644
index 0000000..15be7d3
--- /dev/null
+++ b/webapp/e2e/features/Order.feature
@@ -0,0 +1,11 @@
+Feature: Experiment with the orders
+
+Scenario: The user makes an incorrect order
+ Given An existing user
+ When I choose a product and dont fill the order form
+ Then An error should appear
+
+Scenario: The user can see the history of orders
+ Given An existing user
+ When I log in and want to check the orders
+ Then I can see the orders made in the website
\ No newline at end of file
diff --git a/webapp/e2e/features/Register.feature b/webapp/e2e/features/Register.feature
new file mode 100644
index 0000000..2a4c3a4
--- /dev/null
+++ b/webapp/e2e/features/Register.feature
@@ -0,0 +1,12 @@
+Feature: Register ann existing user
+
+Scenario: The user is already registered on the website
+ Given Data from an existing user
+ When I fill the data in the form
+ Then I should see the error
+
+
+Scenario: I dont fill all the data in the form
+ Given Nothing
+ When I dont fill the data in the form
+ Then I should see the error
diff --git a/webapp/e2e/features/register-form.feature b/webapp/e2e/features/register-form.feature
deleted file mode 100644
index aad790a..0000000
--- a/webapp/e2e/features/register-form.feature
+++ /dev/null
@@ -1,6 +0,0 @@
-Feature: Registering a new user
-
-Scenario: The user is not registered in the site
- Given An unregistered user
- When I fill the data in the form and press submit
- Then A confirmation message should be shown in the screen
\ No newline at end of file
diff --git a/webapp/e2e/jest.config.ts b/webapp/e2e/jest.config.ts
index ec216df..39b1b15 100644
--- a/webapp/e2e/jest.config.ts
+++ b/webapp/e2e/jest.config.ts
@@ -1,8 +1,9 @@
export default {
transform: {
- "^.+\\.tsx?$": "ts-jest"
- },
- testMatch: ["**/steps/*.ts"],
- moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
- preset: "jest-puppeteer",
+ "^.+\\.tsx?$": "ts-jest",
+ },
+ testMatch: ["**/steps/*.ts"],
+ moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
+ preset: "jest-puppeteer",
+ testTimeout: 150000,
}
\ No newline at end of file
diff --git a/webapp/e2e/steps/AddProduct.steps.ts b/webapp/e2e/steps/AddProduct.steps.ts
new file mode 100644
index 0000000..8ae7ce9
--- /dev/null
+++ b/webapp/e2e/steps/AddProduct.steps.ts
@@ -0,0 +1,71 @@
+import { defineFeature, loadFeature } from 'jest-cucumber';
+import puppeteer from "puppeteer";
+
+const apiEndPoint= 'http://localhost:3000'
+
+const feature = loadFeature('./features/AddProduct.feature');
+
+let page: puppeteer.Page;
+let page2: puppeteer.Page;
+let browser: puppeteer.Browser;
+
+defineFeature(feature, test => {
+
+ beforeEach(async () => {
+ browser = process.env.GITHUB_ACTIONS
+ ? await puppeteer.launch()
+ : await puppeteer.launch({ headless: true });
+
+ page = await browser.newPage();
+
+ await page
+ .goto(apiEndPoint + "/login", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+ page2 = await browser.newPage();
+
+ await page2
+ .goto(apiEndPoint + "/products", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+ });
+
+ test('The user adds new products to the car', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('An existing user', () => {
+ email = "efrengv15@gmail.com"
+ password = "efren"
+ });
+
+ when('I log in and press the button to add my products', async () => {
+
+ // Primero hacemos login
+ await expect(page).toMatch('Iniciar Sesión')
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+ await expect(page).toClick('button', { text: 'Iniciar Sesión' })
+ await expect(page).toClick('button', { text: 'OK' })
+
+ // Añadimos el producto
+ await expect(page2).toMatch('Categorías')
+ await expect(page2).toClick('button', { text: 'Añadir al carrito' })
+ await expect(page2).toClick('button', { text: 'Añadir al carrito' })
+ await expect(page2).toClick('#basic-button')
+ });
+
+ then('They should be in the cart', async () => {
+ await expect(page2).toMatch('Completar el pago')
+ });
+ })
+
+ afterEach(async ()=>{
+ browser.close()
+ })
+
+});
\ No newline at end of file
diff --git a/webapp/e2e/steps/DeleteProduct.steps.ts b/webapp/e2e/steps/DeleteProduct.steps.ts
new file mode 100644
index 0000000..536dd58
--- /dev/null
+++ b/webapp/e2e/steps/DeleteProduct.steps.ts
@@ -0,0 +1,73 @@
+import { defineFeature, loadFeature } from 'jest-cucumber';
+import puppeteer from "puppeteer";
+
+const apiEndPoint= process.env.REACT_APP_URI|| 'http://localhost:3000'
+
+
+const feature = loadFeature('./features/DeleteProduct.feature');
+
+let page: puppeteer.Page;
+let page2: puppeteer.Page;
+let browser: puppeteer.Browser;
+
+defineFeature(feature, test => {
+
+ beforeEach(async () => {
+ browser = process.env.GITHUB_ACTIONS
+ ? await puppeteer.launch()
+ : await puppeteer.launch({ headless: true });
+
+ page = await browser.newPage();
+
+ await page
+ .goto(apiEndPoint + "/login", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+ page2 = await browser.newPage();
+
+ await page2
+ .goto(apiEndPoint + "/products", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+ });
+
+ test('The user deletes a product', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('An existing user', () => {
+ email = "efrengv15@gmail.com"
+ password = "efren"
+ });
+
+ when('I log in and want to delete the product I add', async () => {
+ // Primero hacemos login
+ await expect(page).toMatch('Iniciar Sesión')
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+ await expect(page).toClick('button', { text: 'Iniciar Sesión' })
+ await expect(page).toClick('button', { text: 'OK' })
+
+ // Añadimos el producto
+ await expect(page2).toMatch('Categorías')
+ await expect(page2).toClick('button', { text: 'Añadir al carrito' })
+ await expect(page2).toClick('#basic-button')
+ await expect(page2).toMatch('Completar el pago')
+ });
+
+ then('I should be able to delete the product', async () => {
+ // Lo eliminamos
+ await expect(page2).toClick('#basic-button')
+ await expect(page2).toClick('#delete-button')
+ });
+ })
+
+ afterEach(async ()=>{
+ browser.close()
+ })
+
+});
\ No newline at end of file
diff --git a/webapp/e2e/steps/Login.steps.ts b/webapp/e2e/steps/Login.steps.ts
new file mode 100644
index 0000000..e822bff
--- /dev/null
+++ b/webapp/e2e/steps/Login.steps.ts
@@ -0,0 +1,88 @@
+import { defineFeature, loadFeature } from 'jest-cucumber';
+import puppeteer from "puppeteer";
+
+const apiEndPoint= process.env.REACT_APP_URI|| 'http://localhost:3000'
+
+const feature = loadFeature('./features/Login.feature');
+
+let page: puppeteer.Page;
+let page2: puppeteer.Page;
+let browser: puppeteer.Browser;
+
+defineFeature(feature, test => {
+
+ beforeEach(async () => {
+ browser = process.env.GITHUB_ACTIONS
+ ? await puppeteer.launch()
+ : await puppeteer.launch({ headless: true });
+ page = await browser.newPage();
+
+ await page
+ .goto(apiEndPoint + "/login", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+ page2 = await browser.newPage();
+
+ await page2
+ .goto(apiEndPoint + "/products", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+ });
+
+ test('The user is registered in the website', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('An existing user', () => {
+ email = "efrengv15@gmail.com"
+ password = "efren"
+ });
+
+ when('I fill the data in the form', async () => {
+ await expect(page).toMatch('Iniciar Sesión')
+
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+
+ await expect(page).toClick('button', { text: 'Iniciar Sesión' })
+ });
+
+ then('I should see the correct page', async () => {
+ await expect(page).toMatch('Sesión iniciada')
+ });
+ })
+
+
+ test('Incorrect login from a non existing user', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('A non existing user', () => {
+ email = "error@gmail.com"
+ password = "error"
+ });
+
+ when('I fill the data in the form', async () => {
+ await expect(page).toMatch('Iniciar Sesión')
+
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+
+ await expect(page).toClick('button', { text: 'Iniciar Sesión' })
+ });
+
+ then('I should see an error in the page', async () => {
+ await expect(page).toMatch('El usuario o contraseña son incorrectos, vuelva a introducirlos')
+ });
+ })
+
+ afterEach(async ()=>{
+ browser.close()
+ })
+
+});
\ No newline at end of file
diff --git a/webapp/e2e/steps/Order.steps.ts b/webapp/e2e/steps/Order.steps.ts
new file mode 100644
index 0000000..5ee0286
--- /dev/null
+++ b/webapp/e2e/steps/Order.steps.ts
@@ -0,0 +1,124 @@
+import { defineFeature, loadFeature } from 'jest-cucumber';
+import puppeteer from "puppeteer";
+
+const apiEndPoint= process.env.REACT_APP_URI|| 'http://localhost:3000'
+
+const feature = loadFeature('./features/Order.feature');
+
+let page: puppeteer.Page;
+let page2: puppeteer.Page;
+let page3: puppeteer.Page;
+let page4: puppeteer.Page;
+
+
+let browser: puppeteer.Browser;
+
+defineFeature(feature, test => {
+
+ beforeEach(async () => {
+ browser = process.env.GITHUB_ACTIONS
+ ? await puppeteer.launch()
+ : await puppeteer.launch({ headless: true });
+
+ page = await browser.newPage();
+
+ await page
+ .goto(apiEndPoint + "/login", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+ page2 = await browser.newPage();
+
+ await page2
+ .goto(apiEndPoint + "/products", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+
+ page3 = await browser.newPage();
+
+ await page3
+ .goto(apiEndPoint + "/pago", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+
+ page4 = await browser.newPage();
+
+ await page4
+ .goto(apiEndPoint + "/user/orderHistory", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+ });
+
+ test('The user makes an incorrect order', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('An existing user', () => {
+ email = "efrengv15@gmail.com"
+ password = "efren"
+ });
+
+ when('I choose a product and dont fill the order form', async () => {
+ // Primero hacemos login
+ await expect(page).toMatch('Iniciar Sesión')
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+ await expect(page).toClick('button', { text: 'Iniciar Sesión' })
+ await expect(page).toClick('button', { text: 'OK' })
+
+ // Añadimos el producto
+ await expect(page2).toMatch('Categorías')
+ await expect(page2).toClick('button', { text: 'Añadir al carrito' })
+ await expect(page2).toClick('#basic-button')
+ await expect(page2).toMatch('Completar el pago')
+
+ // "Completamos" el pago
+ await expect(page3).toMatch('Completar el pago')
+ await expect(page3).toClick('button', { text: 'Completar el pago' })
+ });
+
+ then('An error should appear', async () => {
+ await expect(page3).toMatch('El titular no puede ser vacío')
+ });
+ })
+
+
+
+ test('The user can see the history of orders', ({given,when,then}) => {
+
+ let email:string;
+ let password:string;
+
+ given('An existing user', () => {
+ email = "efrengv15@gmail.com"
+ password = "efren"
+ });
+
+ when('I log in and want to check the orders', async () => {
+
+ // Primero hacemos login
+ await expect(page).toMatch('Iniciar Sesión')
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+
+ // Hacemos click en el icono de usuarios y vamos al historial de pedidos
+ await expect(page2).toClick('#basic-button')
+
+ });
+
+ then('I can see the orders made in the website', async () => {
+ await expect(page4).toMatch('orderOneExample')
+ });
+ })
+
+ afterEach(async ()=>{
+ browser.close()
+ })
+
+});
\ No newline at end of file
diff --git a/webapp/e2e/steps/Register.steps.ts b/webapp/e2e/steps/Register.steps.ts
new file mode 100644
index 0000000..3c96699
--- /dev/null
+++ b/webapp/e2e/steps/Register.steps.ts
@@ -0,0 +1,84 @@
+import { defineFeature, loadFeature } from 'jest-cucumber';
+import puppeteer from "puppeteer";
+import { StringifyOptions } from 'querystring';
+
+const apiEndPoint= process.env.REACT_APP_URI|| 'http://localhost:3000'
+
+const feature = loadFeature('./features/Register.feature');
+
+let page: puppeteer.Page;
+let browser: puppeteer.Browser;
+
+defineFeature(feature, test => {
+
+ beforeEach(async () => {
+ browser = process.env.GITHUB_ACTIONS
+ ? await puppeteer.launch()
+ : await puppeteer.launch({ headless: true });
+ page = await browser.newPage();
+
+ await page
+ .goto(apiEndPoint + "/signup", {
+ waitUntil: "networkidle0",
+ })
+ .catch(() => {});
+ });
+
+ test('The user is already registered on the website', ({given,when,then}) => {
+
+ let name:string;
+ let surname:string;
+ let email:string;
+ let password:string;
+
+ given('Data from an existing user', () => {
+ name = "efren"
+ surname = "garcia"
+ email = "efrengv15@gmail.com"
+ password = "error"
+ });
+
+ when('I fill the data in the form', async () => {
+ await expect(page).toMatch('Crear cuenta')
+
+ await expect(page).toFill('#name', name);
+ await expect(page).toFill('#surname', surname);
+ await expect(page).toFill('#email', email);
+ await expect(page).toFill('#pass', password);
+ await expect(page).toFill('#repPass', password);
+
+ await expect(page).toClick('button', { text: 'Crear cuenta' })
+ });
+
+ then('I should see the error', async () => {
+ await expect(page).toMatch('El e-mail ya existe')
+ });
+ })
+
+
+ test('I dont fill all the data in the form', ({given,when,then}) => {
+
+
+ given('Nothing', () => {
+ });
+
+ when('I dont fill the data in the form', async () => {
+ await expect(page).toMatch('Crear cuenta')
+ await expect(page).toClick('button', { text: 'Crear cuenta' })
+ });
+
+ then('I should see the error', async () => {
+ await expect(page).toMatch('La casilla no puede estar vacia')
+ });
+ })
+
+ afterEach(async ()=>{
+ browser.close()
+ });
+
+
+ afterEach(async ()=>{
+ browser.close()
+ });
+
+});
\ No newline at end of file
diff --git a/webapp/e2e/steps/register-form.steps.ts b/webapp/e2e/steps/register-form.steps.ts
deleted file mode 100644
index 0766965..0000000
--- a/webapp/e2e/steps/register-form.steps.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { defineFeature, loadFeature } from 'jest-cucumber';
-import puppeteer from "puppeteer";
-
-const feature = loadFeature('./features/register-form.feature');
-
-let page: puppeteer.Page;
-let browser: puppeteer.Browser;
-
-defineFeature(feature, test => {
-
- beforeAll(async () => {
- browser = process.env.GITHUB_ACTIONS
- ? await puppeteer.launch()
- : await puppeteer.launch({ headless: true });
- page = await browser.newPage();
-
- await page
- .goto("http://localhost:3000", {
- waitUntil: "networkidle0",
- })
- .catch(() => {});
- });
-
- test('The user is not registered in the site', ({given,when,then}) => {
-
- let email:string;
- let username:string;
-
- given('An unregistered user', () => {
- email = "newuser@test.com"
- username = "newuser"
- });
-
- when('I fill the data in the form and press submit', async () => {
- await expect(page).toMatch('Hi, ASW students')
- await expect(page).toFillForm('form[name="register"]', {
- username: username,
- email: email,
- })
- await expect(page).toClick('button', { text: 'Accept' })
- });
-
- then('A confirmation message should be shown in the screen', async () => {
- await expect(page).toMatch('You have been registered in the system!')
- });
- })
-
- afterAll(async ()=>{
- browser.close()
- })
-
-});
-
diff --git a/webapp/loadtestexample/ListProducts.scala b/webapp/loadtestexample/ListProducts.scala
new file mode 100644
index 0000000..f241aa0
--- /dev/null
+++ b/webapp/loadtestexample/ListProducts.scala
@@ -0,0 +1,68 @@
+package loadTests
+
+import scala.concurrent.duration._
+
+import io.gatling.core.Predef._
+import io.gatling.http.Predef._
+import io.gatling.jdbc.Predef._
+
+class ListProducts extends Simulation {
+
+ private val httpProtocol = http
+ .baseUrl("http://localhost:3000")
+ .inferHtmlResources(AllowList(), DenyList("", """.*\.css""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.ico""", """.*\.woff""", """.*\.woff2""", """.*\.(t|o)tf""", """.*\.png""", """.*detectportal\.firefox\.com.*"""))
+ .acceptHeader("*/*")
+ .acceptEncodingHeader("gzip, deflate")
+ .acceptLanguageHeader("es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3")
+ .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0")
+
+ private val headers_0 = Map(
+ "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
+ "Cache-Control" -> "max-age=0",
+ "If-Modified-Since" -> "Sat, 30 Apr 2022 17:45:00 GMT",
+ "If-None-Match" -> """W/"286-1807b936cec"""",
+ "Sec-Fetch-Dest" -> "document",
+ "Sec-Fetch-Mode" -> "navigate",
+ "Sec-Fetch-Site" -> "none",
+ "Sec-Fetch-User" -> "?1",
+ "Upgrade-Insecure-Requests" -> "1"
+ )
+
+ private val headers_1 = Map(
+ "Cache-Control" -> "max-age=0",
+ "If-Modified-Since" -> "Sat, 30 Apr 2022 17:45:00 GMT",
+ "If-None-Match" -> """W/"839e8-1807b936cf2"""",
+ "Sec-Fetch-Dest" -> "script",
+ "Sec-Fetch-Mode" -> "no-cors",
+ "Sec-Fetch-Site" -> "same-origin"
+ )
+
+ private val headers_2 = Map(
+ "Cache-Control" -> "max-age=0",
+ "If-None-Match" -> """W/"69a-5K7maot0N11Txe0RSm25krHO5mc"""",
+ "Origin" -> "http://localhost:3000",
+ "Sec-Fetch-Dest" -> "empty",
+ "Sec-Fetch-Mode" -> "cors",
+ "Sec-Fetch-Site" -> "same-site"
+ )
+
+ private val uri1 = "localhost"
+
+ private val scn = scenario("ListProducts")
+ .exec(
+ http("request_0")
+ .get("/products")
+ .headers(headers_0)
+ .resources(
+ http("request_1")
+ .get("/static/js/main.d94b278b.js")
+ .headers(headers_1),
+ http("request_2")
+ .get("http://" + uri1 + ":5000/product/list")
+ .headers(headers_2)
+ )
+ )
+
+ setUp(scn.inject(rampUsers(50) during(60 seconds))).
+ protocols(httpProtocol)
+}
diff --git a/webapp/package-lock.json b/webapp/package-lock.json
index 322eadd..9c4a837 100644
--- a/webapp/package-lock.json
+++ b/webapp/package-lock.json
@@ -21,7 +21,6 @@
"@types/react-dom": "^17.0.11",
"express": "^4.17.2",
"express-validator": "^6.14.0",
- "jest": "^27.5.1",
"jwt-decode": "^3.1.2",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -944,6 +943,7 @@
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -955,6 +955,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
"integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -966,6 +967,7 @@
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
},
@@ -1046,6 +1048,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -1057,6 +1060,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1082,6 +1086,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -1093,6 +1098,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1104,6 +1110,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -1115,6 +1122,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1126,6 +1134,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1137,6 +1146,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1163,6 +1173,7 @@
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
@@ -1177,6 +1188,7 @@
"version": "7.16.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz",
"integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.5"
},
@@ -2056,7 +2068,8 @@
"node_modules/@bcoe/v8-coverage": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
},
"node_modules/@cnakazawa/watch": {
"version": "1.0.4",
@@ -2078,6 +2091,7 @@
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+ "dev": true,
"optional": true,
"peer": true,
"engines": {
@@ -2088,6 +2102,7 @@
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+ "dev": true,
"optional": true,
"peer": true,
"dependencies": {
@@ -2378,6 +2393,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
"integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
"dependencies": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
@@ -2393,6 +2409,7 @@
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -2401,6 +2418,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -2413,6 +2431,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -2424,6 +2443,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -2438,6 +2458,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -2449,6 +2470,7 @@
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -2457,6 +2479,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
"integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@types/node": "*",
@@ -2473,6 +2496,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2487,6 +2511,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2502,6 +2527,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2512,12 +2538,14 @@
"node_modules/@jest/console/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/@jest/console/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -2526,6 +2554,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -2537,6 +2566,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
"integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "dev": true,
"dependencies": {
"@jest/console": "^27.5.1",
"@jest/reporters": "^27.5.1",
@@ -2583,6 +2613,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2597,6 +2628,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2612,6 +2644,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2622,12 +2655,14 @@
"node_modules/@jest/core/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/@jest/core/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -2636,6 +2671,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -2647,6 +2683,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
"integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "dev": true,
"dependencies": {
"@jest/fake-timers": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -2661,6 +2698,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
"integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@sinonjs/fake-timers": "^8.0.1",
@@ -2677,6 +2715,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
"integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -2690,6 +2729,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
"integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "dev": true,
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
"@jest/console": "^27.5.1",
@@ -2733,6 +2773,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2747,6 +2788,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2762,6 +2804,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2772,12 +2815,14 @@
"node_modules/@jest/reporters/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/@jest/reporters/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -2786,6 +2831,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -2794,6 +2840,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -2805,6 +2852,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
"integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "dev": true,
"dependencies": {
"callsites": "^3.0.0",
"graceful-fs": "^4.2.9",
@@ -2818,6 +2866,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -2826,6 +2875,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
"integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "dev": true,
"dependencies": {
"@jest/console": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -2840,6 +2890,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
"integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "dev": true,
"dependencies": {
"@jest/test-result": "^27.5.1",
"graceful-fs": "^4.2.9",
@@ -2854,6 +2905,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
"integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "dev": true,
"dependencies": {
"@babel/core": "^7.1.0",
"@jest/types": "^27.5.1",
@@ -2879,6 +2931,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2893,6 +2946,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2908,6 +2962,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2918,12 +2973,14 @@
"node_modules/@jest/transform/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/@jest/transform/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -2932,6 +2989,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -2940,6 +2998,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -2951,6 +3010,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
"integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dev": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -2966,6 +3026,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2980,6 +3041,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2995,6 +3057,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3005,12 +3068,14 @@
"node_modules/@jest/types/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/@jest/types/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -3019,6 +3084,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -3533,6 +3599,7 @@
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
"integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+ "dev": true,
"dependencies": {
"type-detect": "4.0.8"
}
@@ -3541,6 +3608,7 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
"integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
"dependencies": {
"@sinonjs/commons": "^1.7.0"
}
@@ -3993,6 +4061,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true,
"engines": {
"node": ">= 6"
}
@@ -4010,6 +4079,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -4017,6 +4087,7 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -4024,6 +4095,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -4031,6 +4103,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -4043,6 +4116,7 @@
"version": "7.1.17",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz",
"integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==",
+ "dev": true,
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0",
@@ -4055,6 +4129,7 @@
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz",
"integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==",
+ "dev": true,
"dependencies": {
"@babel/types": "^7.0.0"
}
@@ -4063,6 +4138,7 @@
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
"integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+ "dev": true,
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
@@ -4072,6 +4148,7 @@
"version": "7.14.2",
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
"integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
+ "dev": true,
"dependencies": {
"@babel/types": "^7.3.0"
}
@@ -4209,6 +4286,7 @@
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
"integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "dev": true,
"dependencies": {
"@types/node": "*"
}
@@ -4231,12 +4309,14 @@
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
- "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+ "dev": true
},
"node_modules/@types/istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
"dependencies": {
"@types/istanbul-lib-coverage": "*"
}
@@ -4245,6 +4325,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
"integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "dev": true,
"dependencies": {
"@types/istanbul-lib-report": "*"
}
@@ -4307,7 +4388,8 @@
"node_modules/@types/prettier": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz",
- "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA=="
+ "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==",
+ "dev": true
},
"node_modules/@types/prop-types": {
"version": "15.7.4",
@@ -4408,7 +4490,8 @@
"node_modules/@types/stack-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+ "dev": true
},
"node_modules/@types/strip-bom": {
"version": "3.0.0",
@@ -4452,6 +4535,7 @@
"version": "16.0.4",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
"integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+ "dev": true,
"dependencies": {
"@types/yargs-parser": "*"
}
@@ -4459,7 +4543,8 @@
"node_modules/@types/yargs-parser": {
"version": "20.2.1",
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
- "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
+ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
+ "dev": true
},
"node_modules/@types/yauzl": {
"version": "2.9.2",
@@ -4820,7 +4905,8 @@
"node_modules/abab": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
- "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
+ "dev": true
},
"node_modules/accepts": {
"version": "1.3.7",
@@ -4838,6 +4924,7 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz",
"integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==",
+ "dev": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4849,6 +4936,7 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
"integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
"dependencies": {
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1"
@@ -4858,6 +4946,7 @@
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4910,6 +4999,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -4940,6 +5030,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
"dependencies": {
"debug": "4"
},
@@ -5043,6 +5134,7 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
"dependencies": {
"type-fest": "^0.21.3"
},
@@ -5088,6 +5180,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -5106,6 +5199,7 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
@@ -5260,7 +5354,8 @@
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
},
"node_modules/at-least-node": {
"version": "1.0.0",
@@ -5337,6 +5432,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
"integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "dev": true,
"dependencies": {
"@jest/transform": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -5358,6 +5454,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -5372,6 +5469,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -5387,6 +5485,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -5397,12 +5496,14 @@
"node_modules/babel-jest/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/babel-jest/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -5411,6 +5512,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -5494,6 +5596,7 @@
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
"integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -5509,6 +5612,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
"integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "dev": true,
"dependencies": {
"@babel/template": "^7.3.3",
"@babel/types": "^7.3.3",
@@ -5601,6 +5705,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
"integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dev": true,
"dependencies": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-bigint": "^7.8.3",
@@ -5623,6 +5728,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
"integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "dev": true,
"dependencies": {
"babel-plugin-jest-hoist": "^27.5.1",
"babel-preset-current-node-syntax": "^1.0.0"
@@ -5661,7 +5767,8 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
"node_modules/base": {
"version": "0.11.2",
@@ -5845,6 +5952,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5854,6 +5962,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
@@ -5864,7 +5973,8 @@
"node_modules/browser-process-hrtime": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
},
"node_modules/browserslist": {
"version": "4.19.1",
@@ -5904,6 +6014,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
"integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
"dependencies": {
"node-int64": "^0.4.0"
}
@@ -5944,7 +6055,8 @@
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
},
"node_modules/buffer-indexof": {
"version": "1.1.1",
@@ -6034,6 +6146,7 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
"integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
+ "dev": true,
"engines": {
"node": ">=10"
},
@@ -6109,6 +6222,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
"integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
"engines": {
"node": ">=10"
}
@@ -6179,12 +6293,14 @@
"node_modules/ci-info": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
- "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw=="
+ "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
+ "dev": true
},
"node_modules/cjs-module-lexer": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+ "dev": true
},
"node_modules/class-utils": {
"version": "0.3.6",
@@ -6318,6 +6434,7 @@
"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",
@@ -6364,6 +6481,7 @@
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true,
"engines": {
"iojs": ">= 1.0.0",
"node": ">= 0.12.0"
@@ -6386,7 +6504,8 @@
"node_modules/collect-v8-coverage": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "dev": true
},
"node_modules/collection-visit": {
"version": "1.0.0",
@@ -6430,6 +6549,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -6521,7 +6641,8 @@
"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": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
},
"node_modules/confusing-browser-globals": {
"version": "1.0.11",
@@ -6677,12 +6798,13 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "devOptional": true
+ "dev": true
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -7108,12 +7230,14 @@
"node_modules/cssom": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
- "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true
},
"node_modules/cssstyle": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
"dependencies": {
"cssom": "~0.3.6"
},
@@ -7124,7 +7248,8 @@
"node_modules/cssstyle/node_modules/cssom": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
},
"node_modules/csstype": {
"version": "3.0.11",
@@ -7175,6 +7300,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
"integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dev": true,
"dependencies": {
"abab": "^2.0.3",
"whatwg-mimetype": "^2.3.0",
@@ -7212,7 +7338,8 @@
"node_modules/decimal.js": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
- "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+ "dev": true
},
"node_modules/decode-uri-component": {
"version": "0.2.0",
@@ -7225,7 +7352,8 @@
"node_modules/dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "dev": true
},
"node_modules/deep-equal": {
"version": "1.1.1",
@@ -7247,12 +7375,14 @@
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
},
"node_modules/deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -7335,6 +7465,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -7356,6 +7487,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -7431,7 +7563,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=0.3.1"
}
@@ -7552,6 +7684,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "dev": true,
"dependencies": {
"webidl-conversions": "^5.0.0"
},
@@ -7563,6 +7696,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -7671,6 +7805,7 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
"integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "dev": true,
"engines": {
"node": ">=10"
},
@@ -7843,6 +7978,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
"integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
@@ -7864,6 +8000,7 @@
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
"dependencies": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
@@ -7876,6 +8013,7 @@
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
"integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
"dependencies": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.6",
@@ -7892,6 +8030,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true,
"engines": {
"node": ">= 0.8.0"
}
@@ -7900,6 +8039,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"optional": true,
"engines": {
"node": ">=0.10.0"
@@ -7909,6 +8049,7 @@
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
"dependencies": {
"prelude-ls": "~1.1.2"
},
@@ -8538,6 +8679,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
@@ -8574,6 +8716,7 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
"engines": {
"node": ">=4.0"
}
@@ -8588,6 +8731,7 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -8640,6 +8784,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
@@ -8662,6 +8807,7 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true,
"engines": {
"node": ">= 0.8.0"
}
@@ -8819,6 +8965,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
"integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"jest-get-type": "^27.5.1",
@@ -9061,12 +9208,14 @@
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
},
"node_modules/fastq": {
"version": "1.13.0",
@@ -9093,6 +9242,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
"integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+ "dev": true,
"dependencies": {
"bser": "2.1.1"
}
@@ -9160,6 +9310,7 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -9648,6 +9799,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -9742,12 +9894,14 @@
"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": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
@@ -9780,6 +9934,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
@@ -9808,6 +9963,7 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
"engines": {
"node": ">=8.0.0"
}
@@ -9816,6 +9972,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
"engines": {
"node": ">=10"
},
@@ -9875,6 +10032,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -9986,12 +10144,14 @@
"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=="
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+ "dev": true
},
"node_modules/growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+ "dev": true,
"optional": true
},
"node_modules/gzip-size": {
@@ -10236,6 +10396,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
"integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dev": true,
"dependencies": {
"whatwg-encoding": "^1.0.5"
},
@@ -10252,7 +10413,8 @@
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
},
"node_modules/html-minifier-terser": {
"version": "6.1.0",
@@ -10362,6 +10524,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
"dependencies": {
"@tootallnate/once": "1",
"agent-base": "6",
@@ -10391,6 +10554,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
"dependencies": {
"agent-base": "6",
"debug": "4"
@@ -10403,6 +10567,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
"engines": {
"node": ">=10.17.0"
}
@@ -10539,6 +10704,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
"integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
+ "dev": true,
"dependencies": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
@@ -10554,6 +10720,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -10566,6 +10733,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -10577,6 +10745,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -10591,6 +10760,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -10602,6 +10772,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
"dependencies": {
"find-up": "^4.0.0"
},
@@ -10613,6 +10784,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
"engines": {
"node": ">=0.8.19"
}
@@ -10629,6 +10801,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -10839,7 +11012,7 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "devOptional": true,
+ "dev": true,
"bin": {
"is-docker": "cli.js"
},
@@ -10875,6 +11048,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -10883,6 +11057,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
"integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -10921,6 +11096,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
"engines": {
"node": ">=0.12.0"
}
@@ -10994,7 +11170,8 @@
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
},
"node_modules/is-regex": {
"version": "1.1.4",
@@ -11049,6 +11226,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
"engines": {
"node": ">=8"
},
@@ -11089,7 +11267,8 @@
"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": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
},
"node_modules/is-weakref": {
"version": "1.0.2",
@@ -11116,7 +11295,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"is-docker": "^2.0.0"
},
@@ -11133,7 +11312,8 @@
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
},
"node_modules/isobject": {
"version": "3.0.1",
@@ -11148,6 +11328,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
"integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -11156,6 +11337,7 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
"integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
+ "dev": true,
"dependencies": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
@@ -11171,6 +11353,7 @@
"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"
}
@@ -11179,6 +11362,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
"dependencies": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
@@ -11192,6 +11376,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -11200,6 +11385,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -11211,6 +11397,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
"dependencies": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
@@ -11224,6 +11411,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -11232,6 +11420,7 @@
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
"integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
+ "dev": true,
"dependencies": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
@@ -11268,6 +11457,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
"integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "dev": true,
"dependencies": {
"@jest/core": "^27.5.1",
"import-local": "^3.0.2",
@@ -11292,6 +11482,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
"integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"execa": "^5.0.0",
@@ -11305,6 +11496,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
"integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/test-result": "^27.5.1",
@@ -11334,6 +11526,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -11348,6 +11541,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -11363,6 +11557,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -11373,12 +11568,14 @@
"node_modules/jest-circus/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-circus/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -11387,6 +11584,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -11398,6 +11596,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
"integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "dev": true,
"dependencies": {
"@jest/core": "^27.5.1",
"@jest/test-result": "^27.5.1",
@@ -11431,6 +11630,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -11445,6 +11645,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -11460,6 +11661,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -11470,12 +11672,14 @@
"node_modules/jest-cli/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-cli/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -11484,6 +11688,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -11495,6 +11700,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
"integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "dev": true,
"dependencies": {
"@babel/core": "^7.8.0",
"@jest/test-sequencer": "^27.5.1",
@@ -11537,6 +11743,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -11551,6 +11758,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -11566,6 +11774,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -11576,12 +11785,14 @@
"node_modules/jest-config/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-config/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -11590,6 +11801,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -12978,6 +13190,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
"integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "dev": true,
"dependencies": {
"detect-newline": "^3.0.0"
},
@@ -12989,6 +13202,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
"integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"chalk": "^4.0.0",
@@ -13004,6 +13218,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13018,6 +13233,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13033,6 +13249,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13043,12 +13260,14 @@
"node_modules/jest-each/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-each/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13057,6 +13276,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13068,6 +13288,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
"integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -13085,6 +13306,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
"integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -13192,6 +13414,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
"integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@types/graceful-fs": "^4.1.2",
@@ -13217,6 +13440,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
"integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/source-map": "^27.5.1",
@@ -13244,6 +13468,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13258,6 +13483,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13273,6 +13499,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13283,12 +13510,14 @@
"node_modules/jest-jasmine2/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-jasmine2/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13297,6 +13526,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13308,6 +13538,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
"integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "dev": true,
"dependencies": {
"jest-get-type": "^27.5.1",
"pretty-format": "^27.5.1"
@@ -13398,6 +13629,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
"integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^27.5.1",
@@ -13417,6 +13649,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13431,6 +13664,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13446,6 +13680,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13456,12 +13691,14 @@
"node_modules/jest-message-util/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-message-util/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13470,6 +13707,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13481,6 +13719,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
"integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@types/node": "*"
@@ -13493,6 +13732,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+ "dev": true,
"engines": {
"node": ">=6"
},
@@ -13522,6 +13762,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
"integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "dev": true,
"engines": {
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
@@ -13530,6 +13771,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
"integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"chalk": "^4.0.0",
@@ -13550,6 +13792,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
"integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"jest-regex-util": "^27.5.1",
@@ -13563,6 +13806,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13577,6 +13821,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13592,6 +13837,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13602,12 +13848,14 @@
"node_modules/jest-resolve/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-resolve/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13616,6 +13864,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13627,6 +13876,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
"integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "dev": true,
"dependencies": {
"@jest/console": "^27.5.1",
"@jest/environment": "^27.5.1",
@@ -13658,6 +13908,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13672,6 +13923,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13687,6 +13939,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13697,12 +13950,14 @@
"node_modules/jest-runner/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-runner/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13711,6 +13966,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13722,6 +13978,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
"integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "dev": true,
"dependencies": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -13754,6 +14011,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13768,6 +14026,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13783,6 +14042,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13793,12 +14053,14 @@
"node_modules/jest-runtime/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-runtime/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13807,6 +14069,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13818,6 +14081,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
"integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "dev": true,
"dependencies": {
"@types/node": "*",
"graceful-fs": "^4.2.9"
@@ -13830,6 +14094,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
"integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "dev": true,
"dependencies": {
"@babel/core": "^7.7.2",
"@babel/generator": "^7.7.2",
@@ -13862,6 +14127,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13876,6 +14142,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13891,6 +14158,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13901,12 +14169,14 @@
"node_modules/jest-snapshot/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-snapshot/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13915,6 +14185,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -13926,6 +14197,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
"integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@types/node": "*",
@@ -13942,6 +14214,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -13956,6 +14229,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -13971,6 +14245,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -13981,12 +14256,14 @@
"node_modules/jest-util/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-util/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -13995,6 +14272,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -14006,6 +14284,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
"integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "dev": true,
"dependencies": {
"@jest/types": "^27.5.1",
"camelcase": "^6.2.0",
@@ -14022,6 +14301,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -14036,6 +14316,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -14051,6 +14332,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -14061,12 +14343,14 @@
"node_modules/jest-validate/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-validate/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -14075,6 +14359,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -14241,6 +14526,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
"integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "dev": true,
"dependencies": {
"@jest/test-result": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -14258,6 +14544,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -14272,6 +14559,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -14287,6 +14575,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -14297,12 +14586,14 @@
"node_modules/jest-watcher/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/jest-watcher/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -14311,6 +14602,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -14322,6 +14614,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@@ -14335,6 +14628,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -14343,6 +14637,7 @@
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -14375,6 +14670,7 @@
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -14387,6 +14683,7 @@
"version": "16.7.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
"integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "dev": true,
"dependencies": {
"abab": "^2.0.5",
"acorn": "^8.2.4",
@@ -14534,6 +14831,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -14584,6 +14882,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -14724,6 +15023,7 @@
"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"
},
@@ -14752,6 +15052,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
"dependencies": {
"semver": "^6.0.0"
},
@@ -14766,6 +15067,7 @@
"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"
}
@@ -14774,12 +15076,13 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "devOptional": true
+ "dev": true
},
"node_modules/makeerror": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
"integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
"dependencies": {
"tmpl": "1.0.5"
}
@@ -14871,7 +15174,8 @@
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
},
"node_modules/merge2": {
"version": "1.4.1",
@@ -14894,6 +15198,7 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
"dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
@@ -14936,6 +15241,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -15030,6 +15336,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -15165,7 +15472,8 @@
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
},
"node_modules/negotiator": {
"version": "0.6.2",
@@ -15249,12 +15557,14 @@
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+ "dev": true
},
"node_modules/node-notifier": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz",
"integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==",
+ "dev": true,
"optional": true,
"dependencies": {
"growly": "^1.3.0",
@@ -15295,6 +15605,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -15324,6 +15635,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
"dependencies": {
"path-key": "^3.0.0"
},
@@ -15346,7 +15658,8 @@
"node_modules/nwsapi": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
- "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+ "dev": true
},
"node_modules/object-assign": {
"version": "4.1.1",
@@ -15634,6 +15947,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"dependencies": {
"wrappy": "1"
}
@@ -15642,6 +15956,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
"dependencies": {
"mimic-fn": "^2.1.0"
},
@@ -15778,6 +16093,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -15838,7 +16154,8 @@
"node_modules/parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
},
"node_modules/parseurl": {
"version": "1.3.3",
@@ -15877,6 +16194,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -15885,6 +16203,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -15893,6 +16212,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -15945,6 +16265,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true,
"engines": {
"node": ">=8.6"
},
@@ -15956,6 +16277,7 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
"integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
+ "dev": true,
"engines": {
"node": ">= 6"
}
@@ -17362,6 +17684,7 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
"integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
"dependencies": {
"kleur": "^3.0.3",
"sisteransi": "^1.0.5"
@@ -17455,7 +17778,8 @@
"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=="
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
},
"node_modules/pump": {
"version": "3.0.0",
@@ -17471,6 +17795,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -18348,6 +18673,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -18389,6 +18715,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
"dependencies": {
"resolve-from": "^5.0.0"
},
@@ -18462,6 +18789,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -18537,6 +18865,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
"integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+ "dev": true,
"engines": {
"node": ">=10"
}
@@ -18573,6 +18902,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -19064,6 +19394,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
"dependencies": {
"xmlchars": "^2.2.0"
},
@@ -19117,6 +19448,7 @@
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -19347,6 +19679,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -19358,6 +19691,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -19372,6 +19706,7 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+ "dev": true,
"optional": true
},
"node_modules/side-channel": {
@@ -19391,17 +19726,20 @@
"node_modules/signal-exit": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
+ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
+ "dev": true
},
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
},
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -19684,6 +20022,7 @@
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -19693,6 +20032,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -19809,7 +20149,8 @@
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
},
"node_modules/stable": {
"version": "0.1.8",
@@ -19821,6 +20162,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
"integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
+ "dev": true,
"dependencies": {
"escape-string-regexp": "^2.0.0"
},
@@ -19832,6 +20174,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -20028,6 +20371,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
"integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
"dependencies": {
"char-regex": "^1.0.2",
"strip-ansi": "^6.0.0"
@@ -20046,6 +20390,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -20058,7 +20403,8 @@
"node_modules/string-width/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
},
"node_modules/string.prototype.matchall": {
"version": "4.0.6",
@@ -20123,6 +20469,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -20134,6 +20481,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -20160,6 +20508,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -20179,6 +20528,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
"engines": {
"node": ">=8"
},
@@ -20238,6 +20588,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
"integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
@@ -20250,6 +20601,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -20258,6 +20610,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -20375,7 +20728,8 @@
"node_modules/symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
},
"node_modules/tailwindcss": {
"version": "3.0.7",
@@ -20581,6 +20935,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
"integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
"dependencies": {
"ansi-escapes": "^4.2.1",
"supports-hyperlinks": "^2.0.0"
@@ -20679,6 +21034,7 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
"integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
@@ -20697,7 +21053,8 @@
"node_modules/throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
- "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w=="
+ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+ "dev": true
},
"node_modules/through": {
"version": "2.3.8",
@@ -20732,7 +21089,8 @@
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
@@ -20785,6 +21143,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -20804,6 +21163,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
"integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "dev": true,
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -20817,6 +21177,7 @@
"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": ">= 4.0.0"
}
@@ -20825,6 +21186,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dev": true,
"dependencies": {
"punycode": "^2.1.1"
},
@@ -20895,6 +21257,7 @@
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
+ "dev": true,
"optional": true,
"peer": true,
"dependencies": {
@@ -21027,6 +21390,7 @@
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
"optional": true,
"peer": true,
"engines": {
@@ -21037,6 +21401,7 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -21139,6 +21504,7 @@
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -21147,6 +21513,7 @@
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
"engines": {
"node": ">=10"
},
@@ -21170,6 +21537,7 @@
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
"dependencies": {
"is-typedarray": "^1.0.0"
}
@@ -21462,6 +21830,7 @@
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
"integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "dev": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.1",
"convert-source-map": "^1.6.0",
@@ -21475,6 +21844,7 @@
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
"engines": {
"node": ">= 8"
}
@@ -21509,6 +21879,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
"integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
"dependencies": {
"browser-process-hrtime": "^1.0.0"
}
@@ -21517,6 +21888,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
"integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dev": true,
"dependencies": {
"xml-name-validator": "^3.0.0"
},
@@ -21562,6 +21934,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
"integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
"dependencies": {
"makeerror": "1.0.12"
}
@@ -21597,6 +21970,7 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true,
"engines": {
"node": ">=10.4"
}
@@ -21968,6 +22342,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
"dependencies": {
"iconv-lite": "0.4.24"
}
@@ -21976,6 +22351,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -21992,12 +22368,14 @@
"node_modules/whatwg-mimetype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true
},
"node_modules/whatwg-url": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dev": true,
"dependencies": {
"lodash": "^4.7.0",
"tr46": "^2.1.0",
@@ -22011,6 +22389,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -22047,6 +22426,7 @@
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -22378,6 +22758,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -22394,6 +22775,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -22408,6 +22790,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -22418,17 +22801,20 @@
"node_modules/wrap-ansi/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"node_modules/write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
"dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
@@ -22440,6 +22826,7 @@
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
"integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
+ "dev": true,
"engines": {
"node": ">=8.3.0"
},
@@ -22459,12 +22846,14 @@
"node_modules/xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true
},
"node_modules/xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
},
"node_modules/xtend": {
"version": "4.0.2",
@@ -22479,6 +22868,7 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
"engines": {
"node": ">=10"
}
@@ -22486,7 +22876,8 @@
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
},
"node_modules/yaml": {
"version": "1.10.2",
@@ -22500,6 +22891,7 @@
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -22517,6 +22909,7 @@
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
"engines": {
"node": ">=10"
}
@@ -22535,7 +22928,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "devOptional": true,
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -23179,6 +23572,7 @@
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23187,6 +23581,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
"integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23195,6 +23590,7 @@
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.12.13"
}
@@ -23248,6 +23644,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.10.4"
}
@@ -23256,6 +23653,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23272,6 +23670,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.10.4"
}
@@ -23280,6 +23679,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23288,6 +23688,7 @@
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.10.4"
}
@@ -23296,6 +23697,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23304,6 +23706,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23312,6 +23715,7 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
@@ -23329,6 +23733,7 @@
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.14.5"
}
@@ -23337,6 +23742,7 @@
"version": "7.16.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz",
"integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.16.5"
}
@@ -23932,7 +24338,8 @@
"@bcoe/v8-coverage": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
},
"@cnakazawa/watch": {
"version": "1.0.4",
@@ -23948,6 +24355,7 @@
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -23955,6 +24363,7 @@
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+ "dev": true,
"optional": true,
"peer": true,
"requires": {
@@ -24188,6 +24597,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
"integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
"requires": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
@@ -24199,12 +24609,14 @@
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -24214,6 +24626,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"requires": {
"p-locate": "^4.1.0"
}
@@ -24222,6 +24635,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"requires": {
"p-try": "^2.0.0"
}
@@ -24230,6 +24644,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
"requires": {
"p-limit": "^2.2.0"
}
@@ -24239,12 +24654,14 @@
"@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
},
"@jest/console": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
"integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"@types/node": "*",
@@ -24258,6 +24675,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -24266,6 +24684,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -24275,6 +24694,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -24282,17 +24702,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -24303,6 +24726,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
"integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "dev": true,
"requires": {
"@jest/console": "^27.5.1",
"@jest/reporters": "^27.5.1",
@@ -24338,6 +24762,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -24346,6 +24771,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -24355,6 +24781,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -24362,17 +24789,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -24383,6 +24813,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
"integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "dev": true,
"requires": {
"@jest/fake-timers": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -24394,6 +24825,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
"integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"@sinonjs/fake-timers": "^8.0.1",
@@ -24407,6 +24839,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
"integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -24417,6 +24850,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
"integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "dev": true,
"requires": {
"@bcoe/v8-coverage": "^0.2.3",
"@jest/console": "^27.5.1",
@@ -24449,6 +24883,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -24457,6 +24892,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -24466,6 +24902,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -24473,22 +24910,26 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -24499,6 +24940,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
"integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "dev": true,
"requires": {
"callsites": "^3.0.0",
"graceful-fs": "^4.2.9",
@@ -24508,7 +24950,8 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
}
}
},
@@ -24516,6 +24959,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
"integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "dev": true,
"requires": {
"@jest/console": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -24527,6 +24971,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
"integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "dev": true,
"requires": {
"@jest/test-result": "^27.5.1",
"graceful-fs": "^4.2.9",
@@ -24538,6 +24983,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
"integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "dev": true,
"requires": {
"@babel/core": "^7.1.0",
"@jest/types": "^27.5.1",
@@ -24560,6 +25006,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -24568,6 +25015,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -24577,6 +25025,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -24584,22 +25033,26 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -24610,6 +25063,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
"integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dev": true,
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -24622,6 +25076,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -24630,6 +25085,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -24639,6 +25095,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -24646,17 +25103,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -24961,6 +25421,7 @@
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
"integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+ "dev": true,
"requires": {
"type-detect": "4.0.8"
}
@@ -24969,6 +25430,7 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
"integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
"requires": {
"@sinonjs/commons": "^1.7.0"
}
@@ -25259,7 +25721,8 @@
"@tootallnate/once": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true
},
"@trysound/sax": {
"version": "0.2.0",
@@ -25271,6 +25734,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -25278,6 +25742,7 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -25285,6 +25750,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -25292,6 +25758,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -25304,6 +25771,7 @@
"version": "7.1.17",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz",
"integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==",
+ "dev": true,
"requires": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0",
@@ -25316,6 +25784,7 @@
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz",
"integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==",
+ "dev": true,
"requires": {
"@babel/types": "^7.0.0"
}
@@ -25324,6 +25793,7 @@
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
"integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+ "dev": true,
"requires": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
@@ -25333,6 +25803,7 @@
"version": "7.14.2",
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
"integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
+ "dev": true,
"requires": {
"@babel/types": "^7.3.0"
}
@@ -25462,6 +25933,7 @@
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
"integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "dev": true,
"requires": {
"@types/node": "*"
}
@@ -25484,12 +25956,14 @@
"@types/istanbul-lib-coverage": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
- "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+ "dev": true
},
"@types/istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
"requires": {
"@types/istanbul-lib-coverage": "*"
}
@@ -25498,6 +25972,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
"integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "dev": true,
"requires": {
"@types/istanbul-lib-report": "*"
}
@@ -25560,7 +26035,8 @@
"@types/prettier": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz",
- "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA=="
+ "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==",
+ "dev": true
},
"@types/prop-types": {
"version": "15.7.4",
@@ -25661,7 +26137,8 @@
"@types/stack-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+ "dev": true
},
"@types/strip-bom": {
"version": "3.0.0",
@@ -25705,6 +26182,7 @@
"version": "16.0.4",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
"integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+ "dev": true,
"requires": {
"@types/yargs-parser": "*"
}
@@ -25712,7 +26190,8 @@
"@types/yargs-parser": {
"version": "20.2.1",
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
- "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
+ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
+ "dev": true
},
"@types/yauzl": {
"version": "2.9.2",
@@ -25994,7 +26473,8 @@
"abab": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
- "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
+ "dev": true
},
"accepts": {
"version": "1.3.7",
@@ -26008,12 +26488,14 @@
"acorn": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz",
- "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw=="
+ "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==",
+ "dev": true
},
"acorn-globals": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
"integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
"requires": {
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1"
@@ -26022,7 +26504,8 @@
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
}
}
},
@@ -26062,7 +26545,8 @@
"acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
},
"address": {
"version": "1.1.2",
@@ -26084,6 +26568,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
"requires": {
"debug": "4"
}
@@ -26162,6 +26647,7 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
"requires": {
"type-fest": "^0.21.3"
}
@@ -26189,6 +26675,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -26204,6 +26691,7 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
@@ -26319,7 +26807,8 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
},
"at-least-node": {
"version": "1.0.0",
@@ -26371,6 +26860,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
"integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "dev": true,
"requires": {
"@jest/transform": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -26386,6 +26876,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -26394,6 +26885,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -26403,6 +26895,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -26410,17 +26903,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -26485,6 +26981,7 @@
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
"integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -26497,6 +26994,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
"integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "dev": true,
"requires": {
"@babel/template": "^7.3.3",
"@babel/types": "^7.3.3",
@@ -26570,6 +27068,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
"integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dev": true,
"requires": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-bigint": "^7.8.3",
@@ -26589,6 +27088,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
"integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "dev": true,
"requires": {
"babel-plugin-jest-hoist": "^27.5.1",
"babel-preset-current-node-syntax": "^1.0.0"
@@ -26621,7 +27121,8 @@
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
"base": {
"version": "0.11.2",
@@ -26771,6 +27272,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -26780,6 +27282,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
"requires": {
"fill-range": "^7.0.1"
}
@@ -26787,7 +27290,8 @@
"browser-process-hrtime": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
},
"browserslist": {
"version": "4.19.1",
@@ -26814,6 +27318,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
"integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
"requires": {
"node-int64": "^0.4.0"
}
@@ -26837,7 +27342,8 @@
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
},
"buffer-indexof": {
"version": "1.1.1",
@@ -26910,7 +27416,8 @@
"camelcase": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA=="
+ "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
+ "dev": true
},
"camelcase-css": {
"version": "2.0.1",
@@ -26963,7 +27470,8 @@
"char-regex": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true
},
"check-more-types": {
"version": "2.24.0",
@@ -27019,12 +27527,14 @@
"ci-info": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
- "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw=="
+ "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
+ "dev": true
},
"cjs-module-lexer": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+ "dev": true
},
"class-utils": {
"version": "0.3.6",
@@ -27133,6 +27643,7 @@
"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",
@@ -27171,7 +27682,8 @@
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
},
"coa": {
"version": "2.0.2",
@@ -27187,7 +27699,8 @@
"collect-v8-coverage": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "dev": true
},
"collection-visit": {
"version": "1.0.0",
@@ -27228,6 +27741,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -27306,7 +27820,8 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
},
"confusing-browser-globals": {
"version": "1.0.11",
@@ -27417,12 +27932,13 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "devOptional": true
+ "dev": true
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -27716,12 +28232,14 @@
"cssom": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
- "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true
},
"cssstyle": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
"requires": {
"cssom": "~0.3.6"
},
@@ -27729,7 +28247,8 @@
"cssom": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
}
}
},
@@ -27777,6 +28296,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
"integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dev": true,
"requires": {
"abab": "^2.0.3",
"whatwg-mimetype": "^2.3.0",
@@ -27800,7 +28320,8 @@
"decimal.js": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
- "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+ "dev": true
},
"decode-uri-component": {
"version": "0.2.0",
@@ -27810,7 +28331,8 @@
"dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "dev": true
},
"deep-equal": {
"version": "1.1.1",
@@ -27829,12 +28351,14 @@
"deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
},
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
},
"default-gateway": {
"version": "6.0.3",
@@ -27895,7 +28419,8 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
},
"depd": {
"version": "1.1.2",
@@ -27910,7 +28435,8 @@
"detect-newline": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true
},
"detect-node": {
"version": "2.1.0",
@@ -27972,7 +28498,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "devOptional": true
+ "dev": true
},
"diff-sequences": {
"version": "27.5.1",
@@ -28072,6 +28598,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "dev": true,
"requires": {
"webidl-conversions": "^5.0.0"
},
@@ -28079,7 +28606,8 @@
"webidl-conversions": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
- "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "dev": true
}
}
},
@@ -28170,7 +28698,8 @@
"emittery": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
- "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg=="
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "dev": true
},
"emoji-regex": {
"version": "9.2.2",
@@ -28304,6 +28833,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
"integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
"requires": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
@@ -28316,6 +28846,7 @@
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
"requires": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
@@ -28325,6 +28856,7 @@
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
"integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
"requires": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.6",
@@ -28337,18 +28869,21 @@
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"optional": true
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
"requires": {
"prelude-ls": "~1.1.2"
}
@@ -28813,7 +29348,8 @@
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
},
"esquery": {
"version": "1.4.0",
@@ -28836,7 +29372,8 @@
"estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
},
"estree-walker": {
"version": "1.0.1",
@@ -28847,7 +29384,8 @@
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
},
"etag": {
"version": "1.8.1",
@@ -28891,6 +29429,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
"requires": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
@@ -28906,7 +29445,8 @@
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
},
"expand-brackets": {
"version": "2.1.4",
@@ -29034,6 +29574,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
"integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"jest-get-type": "^27.5.1",
@@ -29226,12 +29767,14 @@
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
},
"fastq": {
"version": "1.13.0",
@@ -29255,6 +29798,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
"integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+ "dev": true,
"requires": {
"bser": "2.1.1"
}
@@ -29306,6 +29850,7 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
@@ -29655,6 +30200,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -29724,12 +30270,14 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
"optional": true
},
"function-bind": {
@@ -29751,7 +30299,8 @@
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
},
"get-intrinsic": {
"version": "1.1.1",
@@ -29773,12 +30322,14 @@
"get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true
},
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
},
"get-symbol-description": {
"version": "1.0.0",
@@ -29819,6 +30370,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -29904,12 +30456,14 @@
"graceful-fs": {
"version": "4.2.9",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+ "dev": true
},
"growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+ "dev": true,
"optional": true
},
"gzip-size": {
@@ -30111,6 +30665,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
"integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dev": true,
"requires": {
"whatwg-encoding": "^1.0.5"
}
@@ -30124,7 +30679,8 @@
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
},
"html-minifier-terser": {
"version": "6.1.0",
@@ -30205,6 +30761,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
"requires": {
"@tootallnate/once": "1",
"agent-base": "6",
@@ -30228,6 +30785,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
"requires": {
"agent-base": "6",
"debug": "4"
@@ -30236,7 +30794,8 @@
"human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
},
"iconv-lite": {
"version": "0.6.3",
@@ -30325,6 +30884,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
"integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
+ "dev": true,
"requires": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
@@ -30334,6 +30894,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -30343,6 +30904,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"requires": {
"p-locate": "^4.1.0"
}
@@ -30351,6 +30913,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"requires": {
"p-try": "^2.0.0"
}
@@ -30359,6 +30922,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
"requires": {
"p-limit": "^2.2.0"
}
@@ -30367,6 +30931,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
"requires": {
"find-up": "^4.0.0"
}
@@ -30376,7 +30941,8 @@
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
},
"indent-string": {
"version": "4.0.0",
@@ -30387,6 +30953,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -30548,7 +31115,7 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "devOptional": true
+ "dev": true
},
"is-extendable": {
"version": "1.0.1",
@@ -30568,12 +31135,14 @@
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
},
"is-generator-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true
},
"is-glob": {
"version": "4.0.3",
@@ -30599,7 +31168,8 @@
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
},
"is-number-object": {
"version": "1.0.6",
@@ -30646,7 +31216,8 @@
"is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
},
"is-regex": {
"version": "1.1.4",
@@ -30685,7 +31256,8 @@
"is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
},
"is-string": {
"version": "1.0.7",
@@ -30708,7 +31280,8 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
},
"is-weakref": {
"version": "1.0.2",
@@ -30729,7 +31302,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "devOptional": true,
+ "dev": true,
"requires": {
"is-docker": "^2.0.0"
}
@@ -30743,7 +31316,8 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
},
"isobject": {
"version": "3.0.1",
@@ -30754,12 +31328,14 @@
"istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw=="
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true
},
"istanbul-lib-instrument": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
"integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
+ "dev": true,
"requires": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
@@ -30771,7 +31347,8 @@
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
}
}
},
@@ -30779,6 +31356,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
"requires": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
@@ -30788,12 +31366,14 @@
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -30804,6 +31384,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
"requires": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
@@ -30813,7 +31394,8 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
}
}
},
@@ -30821,6 +31403,7 @@
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
"integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
+ "dev": true,
"requires": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
@@ -30850,6 +31433,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
"integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "dev": true,
"requires": {
"@jest/core": "^27.5.1",
"import-local": "^3.0.2",
@@ -30860,6 +31444,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
"integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"execa": "^5.0.0",
@@ -30870,6 +31455,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
"integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/test-result": "^27.5.1",
@@ -30896,6 +31482,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -30904,6 +31491,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -30913,6 +31501,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -30920,17 +31509,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -30941,6 +31533,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
"integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "dev": true,
"requires": {
"@jest/core": "^27.5.1",
"@jest/test-result": "^27.5.1",
@@ -30960,6 +31553,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -30968,6 +31562,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -30977,6 +31572,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -30984,17 +31580,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -31005,6 +31604,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
"integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "dev": true,
"requires": {
"@babel/core": "^7.8.0",
"@jest/test-sequencer": "^27.5.1",
@@ -31036,6 +31636,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -31044,6 +31645,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -31053,6 +31655,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -31060,17 +31663,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32182,6 +32788,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
"integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "dev": true,
"requires": {
"detect-newline": "^3.0.0"
}
@@ -32190,6 +32797,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
"integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"chalk": "^4.0.0",
@@ -32202,6 +32810,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32210,6 +32819,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32219,6 +32829,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32226,17 +32837,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32247,6 +32861,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
"integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -32261,6 +32876,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
"integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -32343,6 +32959,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
"integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"@types/graceful-fs": "^4.1.2",
@@ -32363,6 +32980,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
"integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/source-map": "^27.5.1",
@@ -32387,6 +33005,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32395,6 +33014,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32404,6 +33024,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32411,17 +33032,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32432,6 +33056,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
"integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "dev": true,
"requires": {
"jest-get-type": "^27.5.1",
"pretty-format": "^27.5.1"
@@ -32497,6 +33122,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
"integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^27.5.1",
@@ -32513,6 +33139,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32521,6 +33148,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32530,6 +33158,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32537,17 +33166,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32558,6 +33190,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
"integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"@types/node": "*"
@@ -32567,6 +33200,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+ "dev": true,
"requires": {}
},
"jest-puppeteer": {
@@ -32582,12 +33216,14 @@
"jest-regex-util": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg=="
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "dev": true
},
"jest-resolve": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
"integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"chalk": "^4.0.0",
@@ -32605,6 +33241,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32613,6 +33250,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32622,6 +33260,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32629,17 +33268,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32650,6 +33292,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
"integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"jest-regex-util": "^27.5.1",
@@ -32660,6 +33303,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
"integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "dev": true,
"requires": {
"@jest/console": "^27.5.1",
"@jest/environment": "^27.5.1",
@@ -32688,6 +33332,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32696,6 +33341,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32705,6 +33351,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32712,17 +33359,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32733,6 +33383,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
"integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "dev": true,
"requires": {
"@jest/environment": "^27.5.1",
"@jest/fake-timers": "^27.5.1",
@@ -32762,6 +33413,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32770,6 +33422,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32779,6 +33432,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32786,17 +33440,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32807,6 +33464,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
"integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "dev": true,
"requires": {
"@types/node": "*",
"graceful-fs": "^4.2.9"
@@ -32816,6 +33474,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
"integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "dev": true,
"requires": {
"@babel/core": "^7.7.2",
"@babel/generator": "^7.7.2",
@@ -32845,6 +33504,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32853,6 +33513,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32862,6 +33523,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32869,17 +33531,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32890,6 +33555,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
"integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"@types/node": "*",
@@ -32903,6 +33569,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32911,6 +33578,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32920,6 +33588,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32927,17 +33596,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -32948,6 +33620,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
"integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "dev": true,
"requires": {
"@jest/types": "^27.5.1",
"camelcase": "^6.2.0",
@@ -32961,6 +33634,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -32969,6 +33643,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -32978,6 +33653,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -32985,17 +33661,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -33109,6 +33788,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
"integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "dev": true,
"requires": {
"@jest/test-result": "^27.5.1",
"@jest/types": "^27.5.1",
@@ -33123,6 +33803,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -33131,6 +33812,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -33140,6 +33822,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -33147,17 +33830,20 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -33168,6 +33854,7 @@
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
"requires": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@@ -33177,12 +33864,14 @@
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -33211,6 +33900,7 @@
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -33220,6 +33910,7 @@
"version": "16.7.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
"integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "dev": true,
"requires": {
"abab": "^2.0.5",
"acorn": "^8.2.4",
@@ -33332,7 +34023,8 @@
"kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true
},
"klona": {
"version": "2.0.5",
@@ -33370,7 +34062,8 @@
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true
},
"levn": {
"version": "0.4.1",
@@ -33489,6 +34182,7 @@
"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"
}
@@ -33511,6 +34205,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
"requires": {
"semver": "^6.0.0"
},
@@ -33518,7 +34213,8 @@
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
}
}
},
@@ -33526,12 +34222,13 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "devOptional": true
+ "dev": true
},
"makeerror": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
"integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
"requires": {
"tmpl": "1.0.5"
}
@@ -33607,7 +34304,8 @@
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
},
"merge2": {
"version": "1.4.1",
@@ -33624,6 +34322,7 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
@@ -33650,7 +34349,8 @@
"mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
},
"min-indent": {
"version": "1.0.1",
@@ -33717,6 +34417,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -33824,7 +34525,8 @@
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
},
"negotiator": {
"version": "0.6.2",
@@ -33903,12 +34605,14 @@
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+ "dev": true
},
"node-notifier": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz",
"integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==",
+ "dev": true,
"optional": true,
"requires": {
"growly": "^1.3.0",
@@ -33947,7 +34651,8 @@
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
},
"normalize-range": {
"version": "0.1.2",
@@ -33965,6 +34670,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
"requires": {
"path-key": "^3.0.0"
}
@@ -33981,7 +34687,8 @@
"nwsapi": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
- "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+ "dev": true
},
"object-assign": {
"version": "4.1.1",
@@ -34192,6 +34899,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"requires": {
"wrappy": "1"
}
@@ -34200,6 +34908,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
"requires": {
"mimic-fn": "^2.1.0"
}
@@ -34287,7 +34996,8 @@
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
},
"param-case": {
"version": "3.0.4",
@@ -34335,7 +35045,8 @@
"parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
},
"parseurl": {
"version": "1.3.3",
@@ -34369,17 +35080,20 @@
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
},
"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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
},
"path-parse": {
"version": "1.0.7",
@@ -34425,12 +35139,14 @@
"picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
},
"pirates": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
- "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw=="
+ "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
+ "dev": true
},
"pkg-dir": {
"version": "2.0.0",
@@ -35326,6 +36042,7 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
"integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
"requires": {
"kleur": "^3.0.3",
"sisteransi": "^1.0.5"
@@ -35403,7 +36120,8 @@
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
},
"pump": {
"version": "3.0.0",
@@ -35418,7 +36136,8 @@
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
},
"puppeteer": {
"version": "13.0.1",
@@ -36063,7 +36782,8 @@
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
},
"require-from-string": {
"version": "2.0.2",
@@ -36096,6 +36816,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
"requires": {
"resolve-from": "^5.0.0"
}
@@ -36152,7 +36873,8 @@
"resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
},
"resolve-url": {
"version": "0.2.1",
@@ -36200,7 +36922,8 @@
"resolve.exports": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
- "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ=="
+ "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+ "dev": true
},
"ret": {
"version": "0.1.15",
@@ -36224,6 +36947,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
"requires": {
"glob": "^7.1.3"
}
@@ -36590,6 +37314,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
"requires": {
"xmlchars": "^2.2.0"
}
@@ -36633,6 +37358,7 @@
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
@@ -36834,6 +37560,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
@@ -36841,7 +37568,8 @@
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
},
"shell-quote": {
"version": "1.7.3",
@@ -36853,6 +37581,7 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+ "dev": true,
"optional": true
},
"side-channel": {
@@ -36869,17 +37598,20 @@
"signal-exit": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
+ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
+ "dev": true
},
"sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
},
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
},
"snapdragon": {
"version": "0.8.2",
@@ -37110,6 +37842,7 @@
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -37118,7 +37851,8 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
}
}
},
@@ -37225,7 +37959,8 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
},
"stable": {
"version": "0.1.8",
@@ -37237,6 +37972,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
"integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
+ "dev": true,
"requires": {
"escape-string-regexp": "^2.0.0"
},
@@ -37244,7 +37980,8 @@
"escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true
}
}
},
@@ -37393,6 +38130,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
"integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
"requires": {
"char-regex": "^1.0.2",
"strip-ansi": "^6.0.0"
@@ -37408,6 +38146,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -37417,7 +38156,8 @@
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
}
}
},
@@ -37472,6 +38212,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
@@ -37479,7 +38220,8 @@
"strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
},
"strip-comments": {
"version": "2.0.1",
@@ -37496,7 +38238,8 @@
"strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
},
"strip-indent": {
"version": "3.0.0",
@@ -37509,7 +38252,8 @@
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
},
"style-loader": {
"version": "3.3.1",
@@ -37545,6 +38289,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
"integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
@@ -37553,12 +38298,14 @@
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -37662,7 +38409,8 @@
"symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
},
"tailwindcss": {
"version": "3.0.7",
@@ -37811,6 +38559,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
"integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
"requires": {
"ansi-escapes": "^4.2.1",
"supports-hyperlinks": "^2.0.0"
@@ -37866,6 +38615,7 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
"integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
"requires": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
@@ -37881,7 +38631,8 @@
"throat": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
- "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w=="
+ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+ "dev": true
},
"through": {
"version": "2.3.8",
@@ -37913,7 +38664,8 @@
"tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
},
"to-fast-properties": {
"version": "2.0.0",
@@ -37956,6 +38708,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
"requires": {
"is-number": "^7.0.0"
}
@@ -37969,6 +38722,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
"integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "dev": true,
"requires": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -37978,7 +38732,8 @@
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
}
}
},
@@ -37986,6 +38741,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dev": true,
"requires": {
"punycode": "^2.1.1"
}
@@ -38022,6 +38778,7 @@
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
+ "dev": true,
"optional": true,
"peer": true,
"requires": {
@@ -38043,6 +38800,7 @@
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
"optional": true,
"peer": true
},
@@ -38050,6 +38808,7 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
"optional": true,
"peer": true
}
@@ -38191,12 +38950,14 @@
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
},
"type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
},
"type-is": {
"version": "1.6.18",
@@ -38211,6 +38972,7 @@
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
"requires": {
"is-typedarray": "^1.0.0"
}
@@ -38445,6 +39207,7 @@
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
"integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "dev": true,
"requires": {
"@types/istanbul-lib-coverage": "^2.0.1",
"convert-source-map": "^1.6.0",
@@ -38454,7 +39217,8 @@
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
}
}
},
@@ -38482,6 +39246,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
"integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
"requires": {
"browser-process-hrtime": "^1.0.0"
}
@@ -38490,6 +39255,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
"integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dev": true,
"requires": {
"xml-name-validator": "^3.0.0"
}
@@ -38528,6 +39294,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
"integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
"requires": {
"makeerror": "1.0.12"
}
@@ -38559,7 +39326,8 @@
"webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
- "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true
},
"webpack": {
"version": "5.65.0",
@@ -38816,6 +39584,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
"requires": {
"iconv-lite": "0.4.24"
},
@@ -38824,6 +39593,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
@@ -38839,12 +39609,14 @@
"whatwg-mimetype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true
},
"whatwg-url": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dev": true,
"requires": {
"lodash": "^4.7.0",
"tr46": "^2.1.0",
@@ -38855,6 +39627,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
"requires": {
"isexe": "^2.0.0"
}
@@ -38881,7 +39654,8 @@
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
},
"workbox-background-sync": {
"version": "6.4.2",
@@ -39186,6 +39960,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -39196,6 +39971,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -39204,6 +39980,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -39211,19 +39988,22 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
}
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
"requires": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
@@ -39235,17 +40015,20 @@
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
"integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
+ "dev": true,
"requires": {}
},
"xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true
},
"xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
},
"xtend": {
"version": "4.0.2",
@@ -39256,12 +40039,14 @@
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
},
"yaml": {
"version": "1.10.2",
@@ -39272,6 +40057,7 @@
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -39285,7 +40071,8 @@
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
},
"yauzl": {
"version": "2.10.0",
@@ -39301,7 +40088,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "devOptional": true
+ "dev": true
},
"yocto-queue": {
"version": "0.1.0",
diff --git a/webapp/package.json b/webapp/package.json
index 7453c65..7997f0d 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -15,7 +15,6 @@
"@types/react-dom": "^17.0.11",
"express": "^4.17.2",
"express-validator": "^6.14.0",
- "jest": "^27.5.1",
"jwt-decode": "^3.1.2",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -32,7 +31,7 @@
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --coverage",
- "test:e2e": "start-server-and-test 'npm --prefix ../restapi start' http://localhost:5000/api/users/list prod 3000 'cd e2e && jest'",
+ "test:e2e": "start-server-and-test 'npm --prefix ../restapi start' http://localhost:5000/user/list prod 3000 'cd e2e && jest'",
"eject": "react-scripts eject",
"prod": "ts-node-dev ./server.ts"
},
diff --git a/webapp/server.ts b/webapp/server.ts
index b49cf27..2b1cc52 100644
--- a/webapp/server.ts
+++ b/webapp/server.ts
@@ -1,4 +1,6 @@
import express,{Application} from 'express';
+const path = require('path');
+const publicPath = path.join(__dirname, '.', 'build');
//for using an import here we need to configure the tsconfig.json
//setting the option module to commonjs
@@ -7,6 +9,14 @@ const port: number = 3000;
app.use(express.static('build'))
+app.get('*', (req, res) => {
+ res.sendFile(path.join(publicPath, 'index.html')), function(err: any) {
+ if (err) {
+ res.status(500).send(err)
+ }
+ };
+});
+
app.listen(port, ():void => {
console.log('Webapp started on port '+ port);
}).on("error",(error:Error)=>{
diff --git a/webapp/src/App.test.tsx b/webapp/src/App.test.tsx
index 814f092..a1f4a59 100644
--- a/webapp/src/App.test.tsx
+++ b/webapp/src/App.test.tsx
@@ -1,32 +1,7 @@
import { render, screen } from '@testing-library/react';
-import App from './App';
-import Home from '../src/pages/Home';
-import { Order, Product, User, Object } from '../src/shared/shareddtypes';
+import { Product } from '../src/shared/shareddtypes';
import ListProducts from './pages/ListProducts';
-import ManageProducts from './pages/admin/ManageProducts';
-import ProdAdmin from './pages/admin/ProdAdmin';
-import IUserAdmin from './pages/admin/IUserAdmin';
-import UserAdmin from './pages/admin/UsersAdmin';
-import AddProdutcAdmin from './pages/admin/AddProdcutAdmin';
-import ManageOrders from './pages/admin/ManageOrders';
-import OrderAdmin from './pages/admin/OrderAdmin';
-import Profile from './pages/user/Profile';
-import OrderHistory from './pages/user/OrderHistory'
-import Pago from './pages/Pago';
-/* test('renders learn react link', () => {
- render( );
- const linkElement = screen.getByText(/Source code/i);
- expect(linkElement).toBeInTheDocument();
-}); */
-test('Home Page de la aplicacion', async () => {
- const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
- const productOnCart:any = {};
- render();
- const linkElement = screen.getByAltText(/Banner/i);
- expect(linkElement).toBeInTheDocument();
- expect(screen.getByText(/Últimas unidades/i)).toBeInTheDocument();
-});
test('Ventana Productos', async () => {
@@ -36,68 +11,4 @@ test('Ventana Productos', async () => {
expect(screen.getByText(/Categorías/i)).toBeInTheDocument();
expect(screen.getByText(/Menor a mayor/i)).toBeInTheDocument();
expect(screen.getByLabelText(/Precio/i)).toBeInTheDocument();
-});
-
-
-test('Admin -> Administrar Productos Base', async () => {
- render( );
- expect(screen.getByText(/Código/i)).toBeInTheDocument();
-});
-
-test('Admin -> Administrar Productos Base Datos', async () => {
- const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
- render( );
- expect(screen.getByText(/PruebaTecado/i)).toBeInTheDocument();
- expect(screen.getByText(/Administrar/i)).toBeInTheDocument();
-});
-/*
- test('Admin -> Administrar Usuarios dentro', async () => {
- const userList:User[] = [{name:"Ana", email: "a@uniovi.es"}]
- render( )
- expect(screen.getByText(/Ver pedidos/i)).toBeInTheDocument();
-});*/
-
-test('Admin -> Administrar Usuarios', async () => {
- render( )
- expect(screen.getByText(/Ver pedidos de usuarios/i)).toBeInTheDocument();
-});
-
- test('Admin -> Añadir Productos', async () => {
- render( )
- expect(screen.getByText(/Añadir un nuevo producto/i)).toBeInTheDocument();
-});
-
-test('Admin -> Administrar Pedidos', async () => {
- render( )
- expect(screen.getByText(/Correo del comprador/i)).toBeInTheDocument();
-});
-
-test('Ventana Pago', async () => {
- render( )
- expect(screen.getByText(/Comprueba tu direccion/i)).toBeInTheDocument();
- expect(screen.getByText(/Dirección de envío, por favor ingrese el nombre de su POD/i)).toBeInTheDocument();
-});
-
-test('Admin -> Administrar Pedidos Inside', async () => {
- const productList:Object[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
- const pedido: Order[] = [{codigo: "A", correo: "a@uniovi", fecha: new Date(), precioTotal: 140.23, products: productList},
- {codigo: "B", correo: "b@uniovi", fecha: new Date(), precioTotal: 140.23, products: productList}]
- render( )
- expect(screen.getByText(/a@uniovi/i)).toBeInTheDocument();
-});
-
-test('User -> Sobre La Página', async () => {
- render()
- expect(screen.getByText(/Correo electrónico:/i)).toBeInTheDocument();
- expect(screen.getByText(/Nombre:/i)).toBeInTheDocument();
- expect(screen.getByText(/Apellidos:/i)).toBeInTheDocument();
- expect(screen.getByText(/Contraseña:/i)).toBeInTheDocument();
-});
-
-test('User -> Página historial de datos', async () => {
- render()
- expect(screen.getByText(/Código del pedido/i)).toBeInTheDocument();
- expect(screen.getByText(/Fecha de orden/i)).toBeInTheDocument();
- expect(screen.getByText(/Precio del pedido/i)).toBeInTheDocument();
- expect(screen.getByText(/Productos/i)).toBeInTheDocument();
-});
+});
\ No newline at end of file
diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx
index 63dc653..ca89b81 100644
--- a/webapp/src/App.tsx
+++ b/webapp/src/App.tsx
@@ -1,6 +1,6 @@
import React, { FC, useState } from 'react';
import LogIn from './pages/LogIn';
-import NavBar from './components/NavBar';
+import NavBar from './components/navbar/NavBar';
import SignUp from './pages/Signup';
import Home from './pages/Home';
import ListProducts from './pages/ListProducts';
@@ -14,9 +14,14 @@ import ManageOrders from './pages/admin/ManageOrders';
import Profile from './pages/user/Profile';
import OrderHistory from './pages/user/OrderHistory';
import PrivateRoute from './components/routes/PrivateRoute';
-import UserAdmin from './pages/admin/UsersAdmin';
import jwt_decode from "jwt-decode";
import Swal from 'sweetalert2';
+import Footer from './components/Footer/Footer';
+import ProductDetails from './pages/ProductDetails';
+import HelpPage from './pages/utils/HelpPage';
+import NoPermissions from './pages/utils/NoPermissions';
+import Carrito from './pages/Carrito';
+import { HelpButton } from './components/utils/HelpButton';
const App: FC = () => {
@@ -26,10 +31,9 @@ const App: FC = () => {
try{
var user:any = jwt_decode(localStorage.getItem('token') || '{}');
if(user){
- const exist = cartItems.find(x=> x.codigo == prod.codigo);
+ const exist = cartItems.find(x=> x.codigo === prod.codigo);
if(exist){
- setCartItems(cartItems.map(x=> x.codigo == prod.codigo ? {...exist, cantidad : exist.cantidad +1} : x))
-
+ setCartItems(cartItems.map(x=> x.codigo === prod.codigo ? {...exist, cantidad : exist.cantidad +1} : x))
} else {
setCartItems([...cartItems,{...prod,cantidad:1}])
}
@@ -57,37 +61,39 @@ const App: FC = () => {
- {/* */}
+
}/>
}/>
}/>
- } />
- } />
- } />
} />
} />
}/>
}/>
+ } />
+ } />
}/>
+ } />
+ } />
-
- } />
+
+
+ }
+ />
-
- } />
+
+
+ }
+ />
-
- } />
-
-
- } />
+
+
+ }
+ />
+
+
);
}
export default App;
diff --git a/webapp/src/api/ApiOrders.ts b/webapp/src/api/ApiOrders.ts
new file mode 100644
index 0000000..5697e4c
--- /dev/null
+++ b/webapp/src/api/ApiOrders.ts
@@ -0,0 +1,8 @@
+import {Order} from '../shared/shareddtypes';
+
+export async function getOrders(): Promise{
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ let response = await fetch(apiEndPoint + "/order/list");
+ return response.json();
+}
+
\ No newline at end of file
diff --git a/webapp/src/api/ApiProducts.ts b/webapp/src/api/ApiProducts.ts
new file mode 100644
index 0000000..20fcdc8
--- /dev/null
+++ b/webapp/src/api/ApiProducts.ts
@@ -0,0 +1,47 @@
+import {Product} from '../shared/shareddtypes';
+import axios from 'axios';
+import {v4 as uuidv4} from 'uuid';
+import Swal from 'sweetalert2';
+
+export async function getProducts(): Promise{
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ let response = await fetch(apiEndPoint + "/product/list");
+ return response.json();
+}
+
+export async function getProductosByCategoria(categoria: string): Promise{
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ let response = await fetch(apiEndPoint + "/product/getByCategoria/" + categoria);
+ return response.json();
+}
+
+export async function addProduct(url: string, nombre: string, descripcion: string, precio: string, categoria: string, stock: string): Promise{
+ let codigo = uuidv4();
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.post(apiEndPoint + "/product/addPost", {"codigo": codigo,
+ "nombre": nombre, "categoria": categoria, "stock": Number.parseInt(stock),
+ "precio": Number.parseFloat(precio), "url": url, "descripcion": descripcion}).then(
+ res => {
+ if(res.status === 201){
+ Swal.fire({
+ title: "Producto añadido",
+ text: "Se ha añadido el prodcuto sin problemas",
+ icon: "success"
+ });
+ window.location.assign("/admin/manageProducts")
+ } else {
+ Swal.fire({
+ title: "ERROR",
+ text: "Se ha producido un error al añadir el producto",
+ icon: "error"
+ });
+ }
+ }
+ )
+}
+
+export async function getProductByCode (code: string): Promise {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ let response = await fetch(apiEndPoint + "/product/getByCodigo/" + code, {method: "GET"});
+ return response.json();
+}
\ No newline at end of file
diff --git a/webapp/src/api/ApiUsers.ts b/webapp/src/api/ApiUsers.ts
new file mode 100644
index 0000000..f433f61
--- /dev/null
+++ b/webapp/src/api/ApiUsers.ts
@@ -0,0 +1,88 @@
+import {User} from '../shared/shareddtypes';
+import axios from 'axios';
+import Swal from 'sweetalert2';
+
+export async function getUsers():Promise{
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000/api'
+ let response = await fetch(apiEndPoint+'/users/list');
+ //The objects returned by the api are directly convertible to User objects
+ return response.json()
+}
+
+export async function getDireccionPod(webId: string) {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ let response = await fetch(apiEndPoint + "/user/pod/" + webId);
+
+ if(response.status === 404){
+ return "";
+ }
+ return response.json();
+}
+
+export const handleLogin = async (idUser: String, pass: String) => {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.post(apiEndPoint + "/user/login",{"email":idUser,"password":pass})
+ .then(res => {
+ if(res.status === 201){
+ Swal.fire({
+ title: "Sesión iniciada",
+ icon: "success"
+ }).then(() => {
+ console.log(res.data)
+ localStorage.setItem('token',res.data.token);
+ window.location.assign("/products");
+ });
+ }else{
+ Swal.fire({
+ title: "Creedenciales incorrectos",
+ text: "El usuario o contraseña son incorrectos, vuelva a introducirlos",
+ icon: "error",
+ footer: '¿No tienes cuenta? Registrate ahora! '
+ });
+ }
+ })
+}
+
+export const handleSignup = (name:String,surname:String,email: String,pass: String,repPass:String) => {
+ console.log("EntrA")
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.post(apiEndPoint +"/user/signup",{"name":name,"surname":surname,"email":email,"role":"ROLE_USER","password":pass,"repPassword":repPass})
+ .then(res => {
+ if(res.status === 201){
+ axios.post(apiEndPoint + "/cart/add",{"client_id":res.data.user._id}).then(res =>{
+ if(res.status === 201){
+ Swal.fire({
+ title: "Usuario registrado",
+ text: "Te has registrado correctamente en la aplicación",
+ icon: "success"
+ }).then(() => {
+ window.location.assign("/login");
+ });
+ }
+ })
+ }
+ })
+}
+
+export const foundEmail = async (email: String):Promise => {
+ var status = false;
+ if(email.trim().length > 0){
+ try{
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ status = await axios.get(apiEndPoint +"/user/list/"+ email)
+ .then(res => {
+ return res.status === 200
+ })
+ }catch(error){
+ return false
+ }
+ }
+ return status;
+}
+
+export async function getUserById(id: string) {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000/'
+ let response = await fetch(apiEndPoint+'user/findById/' + id);
+ //The objects returned by the api are directly convertible to User objects
+ return response.json()
+}
\ No newline at end of file
diff --git a/webapp/src/checks/Arguments.ts b/webapp/src/checks/Arguments.ts
deleted file mode 100644
index bbe8a52..0000000
--- a/webapp/src/checks/Arguments.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const checkParams = (text: String) => {
- return text === "" || text == null;
-}
-
-export default checkParams;
\ No newline at end of file
diff --git a/webapp/src/components/Filters.tsx b/webapp/src/components/Filters.tsx
deleted file mode 100644
index 2ad8bbb..0000000
--- a/webapp/src/components/Filters.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import * as React from 'react';
-import Stack from '@mui/material/Stack';
-import Divider from '@mui/material/Divider';
-import Button from '@mui/material/Button';
-
-class Filters extends React.Component {
- render() {
- return (
-
-
- } spacing = {0.5}>
- Almacenamiento
- Monitores
- Ratones
- Sonido
- Teclados
-
-
- );
- }
-}
-
-export default Filters;
\ No newline at end of file
diff --git a/webapp/src/components/Footer/Footer.tsx b/webapp/src/components/Footer/Footer.tsx
new file mode 100644
index 0000000..f8b795a
--- /dev/null
+++ b/webapp/src/components/Footer/Footer.tsx
@@ -0,0 +1,46 @@
+import * as React from 'react';
+import {Container, Grid, Box, Link, Typography} from '@mui/material/';
+
+const Footer = () => {
+ const correo = "dede.es2c@gmail.com";
+
+ return (
+
+
+
+
+
+
+ Aplicación
+ Código fuente
+ Documentación
+
+ Correo de contacto
+ {correo}
+
+
+
+ Acerca de
+ Ana Fernandez Ostio
+ Adrián Santamarina Romero
+ Darío Martínez Bajo
+ Efrén García Valencia
+ Rubén Rubio del Castillo
+
+
+
+
+ Información adicional
+ Grupo Es_2C
+ Arquitectura del Software
+ Ingeneria Informarica del Software
+ Universidad de Oviedo, Asturias
+
+
+
+
+
+ );
+}
+
+export default Footer;
\ No newline at end of file
diff --git a/webapp/src/components/Products.tsx b/webapp/src/components/Products.tsx
index d33f335..c3bdaf2 100644
--- a/webapp/src/components/Products.tsx
+++ b/webapp/src/components/Products.tsx
@@ -1,13 +1,10 @@
-
-import React, { useState } from 'react';
-import { Button, CardActions, CardContent, CardHeader, CardMedia, Grid, IconButton, Typography } from '@mui/material';
+import { Button, CardActions, CardContent, CardHeader, CardMedia, Grid} from '@mui/material';
import { Product} from '../shared/shareddtypes';
-import InfoIcon from '@mui/icons-material/Info';
-import Modal from '@mui/material/Modal';
-import Box from '@mui/material/Box';
+import { Link } from 'react-router-dom';
import ClearIcon from '@mui/icons-material/Clear';
import Card from '@mui/material/Card';
import AddShoppingCartIcon from '@mui/icons-material/AddShoppingCart';
+import {v4 as uuidv4} from 'uuid';
type ProductsProps = {
product: Product[]
@@ -16,110 +13,18 @@ type ProductsProps = {
homePage: boolean
}
-const Prod = {
- nombre: "Nombre",
- categoria: "Categoria",
- precio: 110,
- url: "string",
- descripcion: "gola",
- stock: '10'
-}
-
-const style = {
- position: 'absolute' as 'absolute',
- top: '50%',
- left: '50%',
- transform: 'translate(-50%, -50%)',
- width: 1000,
- height: 900,
- bgcolor: 'background.paper',
- border: '2px solid #000',
- boxShadow: 24,
- p: 4,
- };
-
-
-
const Productos = ( product: ProductsProps) => {
- const [open, setOpen] = useState(false);
- const handleOpen = () => setOpen(true);
- const handleClose = () => setOpen(false);
-
- function saveP(o: Product){
- handleOpen();
- Prod.nombre = o.nombre;
- Prod.categoria = o.categoria;
- Prod.precio = o.precio;
- Prod.descripcion = o.descripcion;
- Prod.url = o.url;
- Prod.stock = o.stock;
- }
-
- function handleAddCart(){
- if(!localStorage.token)
- window.location.assign("/login");
- }
-
-
- if(open){
-
- if(Prod.stock != '0'){
-
- return (
-
-
-
- {Prod.nombre}
-
- Categoria: {Prod.categoria}
-
- Descripcion del Producto: {Prod.descripcion}
-
- Precio del producto: {Prod.precio}
-
- {/* product.onAddCart(Prod)} aria-label='Añadir al carrito' >
-
- */}
-
-
-
-
-
-
- );
- } else {
- return (
-
-
- {Prod.nombre}
-
- Categoria: {Prod.categoria}
-
- Descripcion del Producto: {Prod.descripcion}
-
- Precio del producto: {Prod.precio}
-
- }>
- NO STOCK
-
-
-
-
-
-
- );
- }
- }
return (
-
+ <>
+
{product.product.map(
(p) => {
if(product.homePage){
if(Number.parseInt(p.stock) <= 5 && Number.parseInt(p.stock) > 0 ){
return(
-
+
@@ -127,12 +32,9 @@ const Productos = ( product: ProductsProps) => {
Descripción del producto:
{p.descripcion}
- product.onAddCart(p)} variant="outlined" startIcon = { }>
+ {/* product.onAddCart(p)} variant="outlined" startIcon = { }>
Añadir al carrito
-
- saveP(p) } variant="outlined" startIcon = { }>
- Más información
-
+ */}
@@ -140,12 +42,16 @@ const Productos = ( product: ProductsProps) => {
}
} else {
- if(p.stock != '0') {
+ if(Number.parseInt(p.stock) > 0) {
return (
-
+
-
+
+ {/* */}
+
+
Precio: {p.precio}€
Descripción del producto:
{p.descripcion}
@@ -153,19 +59,18 @@ const Productos = ( product: ProductsProps) => {
product.onAddCart(p)} variant="outlined" startIcon = { }>
Añadir al carrito
- saveP(p) } variant="outlined" startIcon = { }>
- Más información
-
- );
+ );
} else {
return (
-
+
-
+
+
+
Precio: {p.precio}€
Descripción del producto:
{p.descripcion}
@@ -173,18 +78,18 @@ const Productos = ( product: ProductsProps) => {
}>
NO STOCK
- saveP(p) } variant="outlined" startIcon = { }>
- Más información
-
);
}
}
+ return ("");
}
+
)}
+ >
);
}
diff --git a/webapp/src/components/admin/AddProduct.tsx b/webapp/src/components/admin/AddProduct.tsx
new file mode 100644
index 0000000..5d92e8a
--- /dev/null
+++ b/webapp/src/components/admin/AddProduct.tsx
@@ -0,0 +1,140 @@
+import Box from '@mui/material/Box';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import Card from '@mui/material/Card';
+import { CardHeader, CardMedia, Container, TextField } from '@mui/material';
+import InputLabel from '@mui/material/InputLabel';
+import MenuItem from '@mui/material/MenuItem';
+import React, {useState } from 'react';
+import Swal from 'sweetalert2';
+import {addProduct} from "../../api/ApiProducts";
+import Select, { SelectChangeEvent } from '@mui/material/Select';
+import FormControl from '@mui/material/FormControl';
+
+const AddProduct = () => {
+
+ const [urlBase, setUrl] = useState('https://i.postimg.cc/25fVD0hz/TE01.jpg')
+ const [nombreP , setNombre] = useState('')
+ const [descrip, setDescripcion] = useState('')
+ const [stock, setStock] = useState('')
+ const [precio, setPrecio] = useState('')
+ const [categoria, setCategoria] = useState('')
+
+ function checkCampos(url: string, nombre: string, descipcion: string, precio: string, stock: string){
+ if(url === '' || url === null || nombre === '' || nombre === null ||
+ descipcion === '' || descipcion === null || Number.parseFloat(precio) < 0 || Number.parseInt(stock) <= 0 ){
+ Swal.fire({
+ title: "ERROR",
+ text: "Alguno de los campos introducidos no es correcto",
+ icon: "error"
+ });
+ }
+ }
+
+ async function add(url: string, nombre: string, descripcion: string, precio: string, categoria: string, stock: string){
+ checkCampos(nombre, url, descripcion, precio, stock);
+ await addProduct(url, nombre, descripcion, precio, categoria, stock);
+
+ }
+
+ const handleChange = (event: SelectChangeEvent) => {
+ setCategoria(event.target.value as string)
+ }
+
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ setUrl(e.target.value)}
+ />
+
+ setNombre(e.target.value)}
+ />
+
+ setStock(e.target.value)}
+ />
+
+ setPrecio(e.target.value)}
+ />
+
+ setDescripcion(e.target.value)}
+ />
+
+
+ Categoría
+
+ teclado
+ monitor
+ raton
+ almacenamiento
+ sonido
+
+
+
+ add(urlBase, nombreP, descrip, precio, categoria, stock)}>Añadir Producto Nuevo
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AddProduct;
\ No newline at end of file
diff --git a/webapp/src/components/admin/StackAdmin.tsx b/webapp/src/components/admin/StackAdmin.tsx
deleted file mode 100644
index d620579..0000000
--- a/webapp/src/components/admin/StackAdmin.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import React from 'react';
-import Stack from '@mui/material/Stack';
-import Button from '@mui/material/Button';
-import { Typography } from '@mui/material';
-import { Card, CardContent } from '@mui/material';
-import CropSquareIcon from '@mui/icons-material/CropSquare';
-
-const goTo = (pos: string) => {
- if(pos === "productos"){
- window.location.assign("/admin/manageProducts");
- }else if (pos === "añadir"){
- window.location.assign("/admin/addProduct");
- }else if(pos === "usuarios"){
- window.location.assign("/admin/manageUsers");
- }else if(pos === "inicio"){
- window.location.assign("/");
- }
-}
-
-const StackAdmin = () => {
- return (
-
-
-
-
-
- Administrador
- } onClick = {() => goTo("inicio")}>Inicio
- } onClick = {() => goTo("productos")}>Administrar Productos
- } onClick = {() => goTo("añadir")}>Añadir Productos
- } onClick = {() => goTo("usuarios")}>Ver Usuarios
-
-
-
-
- );
-}
-
-export default StackAdmin;
\ No newline at end of file
diff --git a/webapp/src/components/navbar/NavBar.tsx b/webapp/src/components/navbar/NavBar.tsx
new file mode 100644
index 0000000..515a3c9
--- /dev/null
+++ b/webapp/src/components/navbar/NavBar.tsx
@@ -0,0 +1,285 @@
+import * as React from 'react';
+import AppBar from '@mui/material/AppBar';
+import Toolbar from '@mui/material/Toolbar';
+import IconButton from '@mui/material/IconButton';
+import Typography from '@mui/material/Typography';
+import Button from '@mui/material/Button';
+import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
+import { Menu } from '@mui/material';
+import { MenuItem } from '@mui/material';
+import { AccountCircle } from '@mui/icons-material';
+import Badge from '@mui/material/Badge';
+import { Product } from '../../shared/shareddtypes';
+import Link from '@mui/material/Link';
+import DeleteIcon from '@mui/icons-material/Delete';
+import { Container } from '@mui/material';
+import jwt_decode from 'jwt-decode';
+import Swal from 'sweetalert2';
+import NavBarAdmin from '../navbar/NavBarAdmin'
+
+type ProductsProps = {
+ cartItems:Product[]
+}
+
+const NavBar=(cart:ProductsProps) =>{
+ const [anchorEl, setAnchorEl] = React.useState(null);
+ const [anchorElb, setAnchorElb] = React.useState(null);
+ const open = Boolean(anchorEl);
+ const openB = Boolean(anchorElb);
+ const handleClick = (event: React.MouseEvent) => {
+ setAnchorEl(event.currentTarget);
+ };
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+ const handleMenu = (event: React.MouseEvent) => {
+ setAnchorElb(event.currentTarget);
+ };
+ var totalPrice = 0;
+ var numOfProducts = 0
+ cart.cartItems.map(x => numOfProducts+= x.cantidad);
+ cart.cartItems.map(x => totalPrice+= x.cantidad * x.precio);
+ console.log( cart.cartItems)
+
+ function mover(){
+ localStorage.setItem("carrito", JSON.stringify(cart.cartItems));
+ window.location.assign("/carrito");
+ }
+
+ const removeItem = (prod:Product) =>{
+ const index = cart.cartItems.indexOf(prod,0);
+ if(index > -1){
+ if(cart.cartItems[index].cantidad > 1){
+ cart.cartItems[index].cantidad = cart.cartItems[index].cantidad -1 ;
+ } else{
+ cart.cartItems.splice(index);
+ }
+ }
+ }
+
+ const allFunc = (prod:Product) =>{
+ removeItem(prod);
+ handleClose();
+ }
+
+ const cerrarSesion = () => {
+ Swal.fire({
+ title: '¿Quieres cerrar sesión?',
+ text: "Se perderan los productos que teine en el carrito",
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonColor: '#3085d6',
+ cancelButtonColor: '#d33',
+ confirmButtonText: 'Sí'
+ }).then((result) => {
+ if (result.isConfirmed) {
+ localStorage.clear();
+ Swal.fire(
+ 'Sesión cerrada',
+ 'success'
+ )
+ window.location.assign("/");
+ }
+ })
+
+ }
+
+ if(localStorage.getItem('token') != null){
+ var user:any = jwt_decode(localStorage.getItem('token') || '{}');
+
+ if(user.role === "ROLE_ADMIN"){
+ return(
+
+ );
+ } else if(user.role === "ROLE_USER") {
+ return(
+
+
+
+ DeDe
+
+ Inicio
+ Productos
+ Mis pedidos
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cerrarSesion()} color="inherit">Cerrar Sesión
+
+
+ );
+ }
+ }
+
+ return(
+
+
+
+ DeDe
+
+ Inicio
+ Productos
+
+
+
+
+
+
+
+
+
+
+
+ Iniciar Sesión / Registro
+
+
+ );
+
+}
+export default NavBar;
diff --git a/webapp/src/components/NavBar.tsx b/webapp/src/components/navbar/NavBarAdmin.tsx
similarity index 61%
rename from webapp/src/components/NavBar.tsx
rename to webapp/src/components/navbar/NavBarAdmin.tsx
index 4d89170..5295f5e 100644
--- a/webapp/src/components/NavBar.tsx
+++ b/webapp/src/components/navbar/NavBarAdmin.tsx
@@ -8,21 +8,22 @@ import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
import { Menu } from '@mui/material';
import { MenuItem } from '@mui/material';
import { AccountCircle } from '@mui/icons-material';
-import Badge, { BadgeProps } from '@mui/material/Badge';
-import { styled } from '@mui/material/styles';
-import { Product } from '../shared/shareddtypes';
+import Badge from '@mui/material/Badge';
+import { Product } from '../../shared/shareddtypes';
import Link from '@mui/material/Link';
import DeleteIcon from '@mui/icons-material/Delete';
import { Container } from '@mui/material';
+import Swal from 'sweetalert2';
type ProductsProps = {
- cartItems:Product[]
+ cartItems:Product[]
}
-
-
-const NavBar=(cart:ProductsProps) =>{
+
+const NavBarAdmin = (cart:ProductsProps) => {
const [anchorEl, setAnchorEl] = React.useState(null);
+ const [anchorElb, setAnchorElb] = React.useState(null);
const open = Boolean(anchorEl);
+ const openB = Boolean(anchorElb);
const handleClick = (event: React.MouseEvent) => {
setAnchorEl(event.currentTarget);
};
@@ -30,13 +31,29 @@ const NavBar=(cart:ProductsProps) =>{
setAnchorEl(null);
};
const handleMenu = (event: React.MouseEvent) => {
- setAnchorEl(event.currentTarget);
+ setAnchorElb(event.currentTarget);
};
var totalPrice = 0;
var numOfProducts = 0
cart.cartItems.map(x => numOfProducts+= x.cantidad);
cart.cartItems.map(x => totalPrice+= x.cantidad * x.precio);
+ const carrt = localStorage.getItem("cart");
+ if(carrt !== null){
+ for(let i =0; i < JSON.parse(carrt).length; i++){
+ cart.cartItems[i] = {
+ nombre: JSON.parse(carrt)[i]['nombre'],
+ codigo: JSON.parse(carrt)[i]['codigo'],
+ descripcion: JSON.parse(carrt)[i]['descripcion'],
+ precio: JSON.parse(carrt)[i]['precio'],
+ cantidad: JSON.parse(carrt)[i]['cantidad'],
+ url: JSON.parse(carrt)[i]['url'],
+ stock: JSON.parse(carrt)[i]['stock'],
+ categoria: JSON.parse(carrt)[i]['categoria'],
+ }
+ }
+ }
+
const removeItem = (prod:Product) =>{
const index = cart.cartItems.indexOf(prod,0);
if(index > -1){
@@ -53,19 +70,51 @@ const NavBar=(cart:ProductsProps) =>{
handleClose();
}
- return(
+ const cerrarSesion = () => {
+ Swal.fire({
+ title: '¿Quieres cerrar sesión?',
+ text: "Se perderan los productos que teine en el carrito",
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonColor: '#3085d6',
+ cancelButtonColor: '#d33',
+ confirmButtonText: 'Sí'
+ }).then((result) => {
+ if (result.isConfirmed) {
+ localStorage.clear();
+ Swal.fire(
+ 'Sesión cerrada',
+ 'success'
+ )
+ window.location.assign("/");
+ }
+ })
+
+ }
+
+ function goTo(){
+ window.location.assign("/products");
+ }
+
+ function goTo2(){
+ console.log("Antes de cambiar");
+ console.log(cart.cartItems);
+ localStorage.setItem("carrito", JSON.stringify(cart.cartItems));
+ window.location.assign("/carrito");
+ }
+
+ return (
-
-
- DeDe
-
- Inicio
- Productos
-
-
-
+
+ DeDe
+ Inicio
+ goTo()}>Productos
+ Añadir Productos
+ Administrar Productos
+ Administrar Pedidos
+
- {
-
+
{prod.nombre} x{prod.cantidad} precio: {prod.cantidad * prod.precio}€
{
right:200
}}>
- Precio total: {totalPrice}€
+ Precio total: {totalPrice.toFixed(2)}€
Completar el pago
+ }} onClick ={() => goTo2()}> Completar el pago
>
) :(
@@ -133,14 +178,14 @@ const NavBar=(cart:ProductsProps) =>{
aria-label="account of current user"
aria-controls="menu-appbar"
aria-haspopup="true"
- onClick={handleClick}
+ onClick={handleMenu}
color = "inherit"
>
-
Iniciar Sesión / Registro
+
cerrarSesion()} color="inherit">Cerrar Sesión
- );
-
-}
-const showProducts = () =>{
- return(
-
hola
);
+
}
-export default NavBar;
+
+export default NavBarAdmin;
\ No newline at end of file
diff --git a/webapp/src/components/utils/CarritoItem.tsx b/webapp/src/components/utils/CarritoItem.tsx
new file mode 100644
index 0000000..1c19024
--- /dev/null
+++ b/webapp/src/components/utils/CarritoItem.tsx
@@ -0,0 +1,30 @@
+import TableCell from '@mui/material/TableCell';
+import TableRow from '@mui/material/TableRow';
+import { Product, Object } from '../../shared/shareddtypes';
+
+type ItemProps = {
+ items: Object[]
+}
+
+const CarritoItem = (item: ItemProps) => {
+
+ return(
+ <>
+ {item.items.map((i) => {
+ console.log(i)
+ return(
+
+ {i.codigo}
+ {i.cantidad}
+ {i.cantidad}
+ {i.cantidad}
+
+
+ );
+ })}
+ >
+ );
+
+}
+
+export default CarritoItem;
\ No newline at end of file
diff --git a/webapp/src/components/utils/HelpButton.tsx b/webapp/src/components/utils/HelpButton.tsx
new file mode 100644
index 0000000..010e38a
--- /dev/null
+++ b/webapp/src/components/utils/HelpButton.tsx
@@ -0,0 +1,17 @@
+import React from "react";
+import HelpIcon from '@mui/icons-material/Help';
+import IconButton from '@mui/material/IconButton';
+import { useNavigate } from "react-router-dom";
+
+export const HelpButton = () => {
+ let nav = useNavigate();
+ return (
+
+
+ nav('help')}>
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/webapp/src/img/AL01.jpg b/webapp/src/img/AL01.jpg
deleted file mode 100644
index 9cad519..0000000
Binary files a/webapp/src/img/AL01.jpg and /dev/null differ
diff --git a/webapp/src/img/MO01.jpg b/webapp/src/img/MO01.jpg
deleted file mode 100644
index c070a19..0000000
Binary files a/webapp/src/img/MO01.jpg and /dev/null differ
diff --git a/webapp/src/img/RA01.jpg b/webapp/src/img/RA01.jpg
deleted file mode 100644
index 441baab..0000000
Binary files a/webapp/src/img/RA01.jpg and /dev/null differ
diff --git a/webapp/src/img/TE01.jpg b/webapp/src/img/TE01.jpg
deleted file mode 100644
index bd24bb3..0000000
Binary files a/webapp/src/img/TE01.jpg and /dev/null differ
diff --git a/webapp/src/img/US01.jpg b/webapp/src/img/US01.jpg
deleted file mode 100644
index e37319d..0000000
Binary files a/webapp/src/img/US01.jpg and /dev/null differ
diff --git a/webapp/src/pages/Carrito.tsx b/webapp/src/pages/Carrito.tsx
new file mode 100644
index 0000000..3b6a2d0
--- /dev/null
+++ b/webapp/src/pages/Carrito.tsx
@@ -0,0 +1,103 @@
+import { Product } from "../shared/shareddtypes";
+import { styled } from '@mui/material/styles';
+import { tableCellClasses } from '@mui/material/TableCell';
+import {TableBody, Paper, Table,TableContainer, TableHead, Button, TableCell, TableRow} from "@mui/material";
+
+const Carrito = () => {
+
+ const StyledTableCell = styled(TableCell)(({ theme }) => ({
+ [`&.${tableCellClasses.head}`]: {
+ backgroundColor: "#1976d2",
+ color: theme.palette.common.white,
+ },
+ [`&.${tableCellClasses.body}`]: {
+ fontSize: 14,
+ },
+ }));
+
+ const carrt2 = localStorage.getItem("carrito");
+ const cart: Product[] = [];
+ var precioProductosFinal: number = 0;
+ var size: number = 0;
+ if(carrt2 !== null){
+ size = JSON.parse(carrt2).length;
+ for(let i =0; i < size; i++){
+ cart[i] = {
+ nombre: JSON.parse(carrt2)[i]['nombre'],
+ codigo: JSON.parse(carrt2)[i]['codigo'],
+ descripcion: JSON.parse(carrt2)[i]['descripcion'],
+ precio: JSON.parse(carrt2)[i]['precio'],
+ cantidad: JSON.parse(carrt2)[i]['cantidad'],
+ url: JSON.parse(carrt2)[i]['url'],
+ stock: JSON.parse(carrt2)[i]['stock'],
+ categoria: JSON.parse(carrt2)[i]['categoria'],
+ }
+ console.log(cart[i]);
+ precioProductosFinal += cart[i].precio * cart[i].cantidad;
+ }
+ console.log(precioProductosFinal + "");
+ localStorage.setItem("precioCarrito", JSON.stringify(precioProductosFinal.toFixed(2)));
+ console.log(localStorage.getItem("precioCarrito"))
+ }
+
+ console.log(cart)
+ console.log(cart.length)
+ // const carrito = JSON.parse(sessionStorage.getItem('carrito') as string);
+ // localStorage.setItem("carrito", JSON.stringify(localStorage.getItem("carrito")));
+
+ if(cart.length === 0){
+ return(
+
+
+
El carrito esta vacio
+
+ );
+ } else {
+ return(
+
+
+
+
+
+ Artículo
+ Cantidad
+ Precio Articulo
+ Precio Total Articulo
+
+
+
+
+ {cart.map((item: Product) => (
+ <>
+
+ {item.nombre}
+ {item.cantidad}
+ {item.precio}
+ {item.precio * item.cantidad}
+
+ >
+ ))}
+
+ {""}
+ {""}
+ {"Precio Final"}
+ {precioProductosFinal.toFixed(2)}
+
+
+
+
+
+
mover()}>CONFIRMAR PAGO
+
+ );
+ }
+
+ function mover(){
+ localStorage.setItem("carrito", JSON.stringify(cart));
+ //localStorage.setItem("precioCarrito", JSON.stringify(precioProductosFinal.toFixed(2)));
+ window.location.assign('/pago')
+ }
+
+}
+
+export default Carrito;
\ No newline at end of file
diff --git a/webapp/src/pages/Home.tsx b/webapp/src/pages/Home.tsx
index 3d4ca7f..590fe49 100644
--- a/webapp/src/pages/Home.tsx
+++ b/webapp/src/pages/Home.tsx
@@ -1,10 +1,12 @@
-import React, { useState, useEffect, FC } from 'react';
+import React, { useEffect } from 'react';
import { Product } from '../shared/shareddtypes';
import axios from 'axios';
import { Stack, Card, CardContent, CardHeader, CardMedia, Grid } from '@mui/material';
import Products from '../components/Products';
import Typography from '@mui/material/Typography';
+
+
type ProductsProps = {
onAddCart:(prod:Product) => (void);
cartItems:Product[]
@@ -24,7 +26,8 @@ const Home = (func: ProductsProps) => {
const [prods, setProds] = React.useState
([]);
const getProducts = async () => {
- const data = axios.get("http://localhost:5000/product/list").then(
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ const data = axios.get(apiEndPoint + "/product/list").then(
res => {
setProds(res.data)
return res.data
@@ -34,11 +37,12 @@ const Home = (func: ProductsProps) => {
return data != null
}
- useEffect(() => {cargarProductos();}, [])
+ useEffect(() => {cargarProductos();})
const cargarProductos = () => {
prods.map((p) => {
- if(Number.parseInt(p.stock) <= 5 && Number.parseInt(p.stock) >= 0){
+ if(Number.parseInt(p.stock) <= 5 && Number.parseInt(p.stock) > 0){
+ console.log(p.cantidad);
return(
@@ -58,18 +62,20 @@ const Home = (func: ProductsProps) => {
getProducts()
return (
-
-
-
+ <>
+
+
+
{cargarBanner()}
Últimas Unidades
-
+
-
+
+ >
)
}
diff --git a/webapp/src/pages/ListProducts.tsx b/webapp/src/pages/ListProducts.tsx
index c631b98..f58edea 100644
--- a/webapp/src/pages/ListProducts.tsx
+++ b/webapp/src/pages/ListProducts.tsx
@@ -1,4 +1,4 @@
-import React, { FC, useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import Stack from '@mui/material/Stack';
import Divider from '@mui/material/Divider';
import Button from '@mui/material/Button';
diff --git a/webapp/src/pages/LogIn.tsx b/webapp/src/pages/LogIn.tsx
index 4548158..843c627 100644
--- a/webapp/src/pages/LogIn.tsx
+++ b/webapp/src/pages/LogIn.tsx
@@ -6,42 +6,16 @@ import Stack from '@mui/material/Stack';
import logo from '../img/logo-dede.svg';
import { Card, CardContent } from '@mui/material';
import Link from '@mui/material/Link';
-import axios from 'axios';
-import Swal from 'sweetalert2';
-import SelectInput from '@mui/material/Select/SelectInput';
-// import Check from '../checks/Arguments'
-
+import { handleLogin } from '../api/ApiUsers';
const checkParams = (text: String) => {
return text === "" || text == null;
}
-const handleLogin = (idUser: String, pass: String) => {
- axios.post("http://localhost:5000/user/login",{"email":idUser,"password":pass})
- .then(res => {
- if(res.status == 201){
- Swal.fire({
- title: "Sesión iniciada",
- icon: "success"
- }).then(() => {
- console.log(res.data)
- localStorage.setItem('token',res.data.token);
- window.location.assign("/products");
- });
- }else{
- Swal.fire({
- title: "Creedenciales incorrectos",
- text: "El usuario o contraseña son incorrectos, vuelva a introducirlos",
- icon: "error",
- footer: '¿No tienes cuenta? Registrate ahora! '
- });
- }
- })
+const login = (idUser: String, pass: String) => {
+ handleLogin(idUser, pass);
}
-const changeIcon = () => {
-
-}
const LogIn: FC = () => {
const [email, setEmail] = useState('')
@@ -49,15 +23,15 @@ const LogIn: FC = () => {
const [pulse, setPulse] = useState(false)
function allFunc(idUser: String, pass: String){
- handleLogin(idUser, pass);
+ login(idUser, pass);
setPulse(true);
}
return (
-
+
@@ -69,11 +43,11 @@ const LogIn: FC = () => {
{
{
return text === "" || text == null;
@@ -22,6 +23,7 @@ const Pago: FC = () => {
const [tarjeta, setTarjeta] = useState('')
const [fechaCad, setFechaCad] = useState('')
const [CVV, setCVV] = useState('')
+ const [tel, setTel] = useState('')
const [pulse, setPulse] = useState(false)
// Constantes para el pod
@@ -29,11 +31,97 @@ const Pago: FC = () => {
const [pais, setPais] = useState('')
const [localidad, setLocalidad] = useState('')
const [codigo, setCodigo] = useState('')
- const [region, setRegion] = useState('')
+ const [regio, setRegion] = useState('')
const [calle, setCalle] = useState('')
- function allFunc(Titular: String, tarjeta: String,fecha:String,cvv:string){
+ var envio: number = 0;
+
+ async function getPrecioEnvio(direccion:any){
+ var user:any = jwt_decode(localStorage.getItem('token') || '{}');
+ var UserName:User = await getUserById(user.id);
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ const precioEnvio = await axios.post(apiEndPoint + "/order/calculateShipment", {
+ name: UserName.name,
+ street1: direccion['street_address'] + "",
+ city: direccion['locality'] + "",
+ state: direccion['region'] + "",
+ zip: direccion['postalCode'] + "",
+ country: direccion['country'] + "",
+ phone: tel
+ }).then(res => {
+ if(res.status === 200){
+ var dataJson: any = res.data['shippmentCost']
+ envio = Number.parseFloat(dataJson['rate']);
+ console.log(envio)
+ return envio;
+
+ } else {
+ console.log('fallo')
+ }
+ }).catch( (error) => {
+ console.log("En el catch");
+ console.log(error);
+ });
+ return precioEnvio;
+ }
+
+ async function allFunc(Titular: String, tarjeta: String,fecha:String,cvv:string){
setPulse(true);
+ var precio = localStorage.getItem("precioCarrito");
+ if(precio !== null){
+ const direccion = await getDireccionPod(webId);
+ await getPrecioEnvio(direccion);
+ var parseado = JSON.parse(precio);
+ console.log("Envio: " + envio)
+ var precioFinal: number = Number.parseFloat(parseado) + envio*0.95;
+ Swal.fire({
+ title: "Precio Final",
+ text: "El precio de los articulos es de " + parseado + " tras la suma" +
+ " con el precio de envío de " + envio + ". El precio Final que se " +
+ " deberá abonar es de: " + precioFinal.toFixed(2),
+ icon: "warning",
+ confirmButtonColor: '#3085d6',
+ cancelButtonColor: '#d33',
+ confirmButtonText: 'Confirmar pedido!'
+ }).then(async (res) => {
+ if(res.isConfirmed){
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000';
+ var user:any = jwt_decode(localStorage.getItem('token') || '{}');
+ var UserName:User = await getUserById(user.id);
+ let codigo2 = uuidv4();
+
+ const carrt2 = localStorage.getItem("carrito");
+ const cart: Product[] = [];
+ var size: number = 0;
+ if(carrt2 !== null){
+ size = JSON.parse(carrt2).length;
+ for(let i =0; i < size; i++){
+ cart[i] = {
+ nombre: JSON.parse(carrt2)[i]['nombre'],
+ codigo: JSON.parse(carrt2)[i]['codigo'],
+ descripcion: JSON.parse(carrt2)[i]['descripcion'],
+ precio: JSON.parse(carrt2)[i]['precio'],
+ cantidad: JSON.parse(carrt2)[i]['cantidad'],
+ url: JSON.parse(carrt2)[i]['url'],
+ stock: JSON.parse(carrt2)[i]['cantidad'],
+ categoria: JSON.parse(carrt2)[i]['categoria'],
+ }
+
+ }
+ }
+ axios.post(apiEndPoint + "/order/addOrder",
+ {"codigo": codigo2, "correo": UserName.email, "direccion":
+ calle + " " + localidad + " " + pais + " " + codigo + " " + regio, "fecha": new Date(),
+ "products": cart}).then(
+ resp => {
+ window.location.assign("/products");
+ console.log(resp.data);
+ }
+ );
+ }
+ })
+
+ }
}
@@ -68,7 +156,7 @@ const Pago: FC = () => {
}
return (
-
+
{
required
name = "Titular de la tarjeta"
label = "Titular de la tarjeta"
- defaultValue= "Titular de la tarjeta"
variant="outlined"
size="small"
value = {titular}
error = {checkParams(titular) && pulse}
helperText={checkParams(titular) && pulse ? 'El titular no puede ser vacío' : ''}
onChange = {(e: any) => setTitular(e.target.value)}
- // helperText = "Valor incorrecto"
/>
{
required
name = "Numero de tarjeta"
label = "Numero de tarjeta"
- defaultValue= "Numero de tarjeta"
variant="outlined"
size="small"
value = {tarjeta}
error = {checkParams(tarjeta) && pulse}
helperText={checkParams(tarjeta) && pulse ? 'El numero de la tarjeta no puede ser vacío' : ''}
onChange = {(e: any) => setTarjeta(e.target.value)}
- // helperText = "Valor incorrecto"
/>
@@ -118,30 +202,39 @@ const Pago: FC = () => {
required
name = "Fecha de caducidad"
label = "Fecha de caducidad (yyyy-mm-dd)"
- defaultValue= "Fecha de caducidad (yyyy-mm-dd)"
variant="outlined"
size="small"
value = {fechaCad}
error = {checkParams(fechaCad) && pulse}
helperText={checkParams(fechaCad) && pulse ? 'Fecha de caducidad incorrecta' : ''}
onChange = {(e: any) => setFechaCad(e.target.value)}
- // helperText = "Valor incorrecto"
/>
setCVV(e.target.value)}
- // helperText = "Valor incorrecto"
/>
-
+
+ setTel(e.target.value)}
+ />
+
Dirección de envío, por favor ingrese el nombre de su POD
@@ -150,7 +243,6 @@ const Pago: FC = () => {
required
name = "Dirección de Envío"
label = "Dirección de Envío"
- defaultValue= "Dirección de Envío"
value = {webId}
error = {checkParams(webId) && pulse}
helperText={checkParams(webId) && pulse ? 'La direccion no puede estar vacía' : ''}
diff --git a/webapp/src/pages/ProductDetails.tsx b/webapp/src/pages/ProductDetails.tsx
new file mode 100644
index 0000000..cd2296d
--- /dev/null
+++ b/webapp/src/pages/ProductDetails.tsx
@@ -0,0 +1,50 @@
+import { useState, useEffect } from 'react';
+import { Product } from '../shared/shareddtypes';
+import {getProductByCode} from '../api/ApiProducts';
+import { Typography, Paper, Grid } from '@mui/material';
+const ProductDetails = () => {
+
+ const pName = ((window.location.href.split('/'))[5]).replaceAll('%20', "");
+ const [p0, setProdo] = useState();
+ async function getProduct (nombre: string) {
+ setProdo(await getProductByCode(nombre));
+
+ }
+/* function añadirCarrito(){
+ if(p0 === undefined || Number.parseInt(p0.stock) <= 0){
+ Swal.fire({
+ title: "Error",
+ text: "Lo sentimos, producto seleccionado no tiene existecnias o no existe",
+ icon: "error"
+ })
+ }
+ } */
+
+ useEffect(() => {getProduct(pName)});
+ return (
+
+
+
+
+
+
+
+
+
+ {p0?.nombre}
+ Categoías: {p0?.categoria}
+ Descripcion: {p0?.descripcion}
+ Precio: {p0?.precio}€
+ {/* añadirCarrito()} variant="outlined" startIcon = { }>
+ Añadir al carrito
+ */}
+
+
+
+
+
+ );
+
+}
+
+export default ProductDetails;
diff --git a/webapp/src/pages/ProductsSummary.tsx b/webapp/src/pages/ProductsSummary.tsx
index e587315..cd1397b 100644
--- a/webapp/src/pages/ProductsSummary.tsx
+++ b/webapp/src/pages/ProductsSummary.tsx
@@ -1,5 +1,4 @@
import { Container } from '@mui/material';
-import React, {FC } from 'react';
import { Product } from '../shared/shareddtypes';
import Button from '@mui/material/Button';
diff --git a/webapp/src/pages/Signup.tsx b/webapp/src/pages/Signup.tsx
index 43d1296..6961122 100644
--- a/webapp/src/pages/Signup.tsx
+++ b/webapp/src/pages/Signup.tsx
@@ -1,45 +1,29 @@
-import React, { useState, useEffect, FC } from 'react';
+import { useState, FC } from 'react';
import Container from '@mui/material/Container';
import { Card, CardContent, Stack, TextField } from '@mui/material';
import Button from '@mui/material/Button';
import logo from '../img/logo-dede.svg';
import Link from '@mui/material/Link';
-import axios from 'axios';
import Swal from 'sweetalert2';
-import { readdir } from 'fs/promises';
+import { foundEmail, handleSignup } from '../api/ApiUsers';
-const checkParams = (text: String) => {
+const checkParams = (text: string) => {
return text === "" || text == null;
}
-const checkPaswwords = (repPass: String, pass: String) => {
+const checkEmail = (email: string) => {
+ let re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+ return !re.test(email.toString());
+}
+
+const checkPaswwords = (repPass: string, pass: string) => {
return repPass !== pass;
}
-const handleSignup = (name:String,surname:String,email: String,pass: String,repPass:String) => {
- axios.post("http://localhost:5000/user/signup",{"name":name,"surname":surname,"email":email,"role":"ROLE_USER","password":pass,"repPassword":repPass})
- .then(res => {
- console.log(res);
- console.log(res.data);
- if(res.status == 201){
- Swal.fire({
- title: "Usuario registrado",
- text: "Te has registrado correctamente en la aplicación",
- icon: "success"
- }).then(() => {
- window.location.assign("/login");
- });
- }
- })
- }
+const signUp = (name:string,surname:string,email: string,pass: String,repPass:string) => {
+ handleSignup(name, surname, email, pass, repPass);
+}
- const getEmail = async (email: String) => {
- const data = await axios.get("http://localhost:5000/user/list/"+ email).
- then(res => {
- return res.data
- })
- return data != null;
-}
const SignUp: FC = () => {
const [name, setName] = useState('')
@@ -49,25 +33,25 @@ const SignUp: FC = () => {
const [repPass, setRepPass] = useState('')
const [pulse, setPulse] = useState(false)
- async function allFunc(name:String,surname:String,email: String,pass: String,repPass:String){
+ async function allFunc(name:string,surname:string,email: string,pass: string,repPass:string){
setPulse(true);
- if(await getEmail(email).then(resolve => {return resolve})){
+ if(await foundEmail(email)){
Swal.fire({
title: "El e-mail ya existe",
text: "El e-mail ya existe en el sistema, pruebe con otro",
icon: "error"
});
}else{
- handleSignup(name,surname,email,pass,repPass);
+ signUp(name,surname,email,pass,repPass);
}
}
return (
-
+
@@ -79,7 +63,6 @@ const SignUp: FC = () => {
id = "name" required
name = "Nombre"
label = "Nombre"
- defaultValue = "Nombre"
variant = "outlined"
size = "small"
value = {name}
@@ -92,7 +75,6 @@ const SignUp: FC = () => {
id = "surname" required
name = "Apellido"
label = "Apellido"
- defaultValue = "Apellido"
variant = "outlined"
size = "small"
value = {surname}
@@ -105,12 +87,12 @@ const SignUp: FC = () => {
id = "email" required
name = "Correo electronico"
label = "Correo electronico"
- defaultValue = "Correo electronico"
variant = "outlined"
size = "small"
value = {email}
- error = {checkParams(email) && pulse}
- helperText={checkParams(email) && pulse ? 'La casilla no puede estar vacia' : ''}
+ error = {(checkParams(email) && pulse) || (checkEmail(email) && pulse)}
+ helperText={checkParams(email) && pulse ? 'La casilla no puede estar vacia' : ''
+ ||(checkEmail(email) && pulse ? 'Formato de e-mail inválido' : '')}
onChange = {(e: any) => setEmail(e.target.value)}
/>
@@ -119,7 +101,6 @@ const SignUp: FC = () => {
name = "Contraseña"
label = "Contraseña"
type= "password"
- defaultValue= "Contraseña"
size="small"
variant="outlined"
value = {pass}
@@ -133,13 +114,12 @@ const SignUp: FC = () => {
name = "Repetir Contraseña"
label = "Repetir Contraseña"
type= "password"
- defaultValue= "Repetir Contraseña"
size="small"
variant="outlined"
value = {repPass}
- error = {checkParams(repPass) && pulse || checkPaswwords(repPass, pass)}
+ error = {(checkParams(repPass) && pulse) || (checkPaswwords(repPass, pass))}
helperText={checkParams(repPass) && pulse ? 'La casilla no puede estar vacia' : ''
- || checkPaswwords(repPass, pass) && pulse ? 'Las contraseñas no coinciden' : ''}
+ || (checkPaswwords(repPass, pass) && pulse ? 'Las contraseñas no coinciden' : '')}
onChange = {(e: any) => setRepPass(e.target.value)}
/>
diff --git a/webapp/src/pages/admin/AddProdcutAdmin.tsx b/webapp/src/pages/admin/AddProdcutAdmin.tsx
index 72a8bbf..f357788 100644
--- a/webapp/src/pages/admin/AddProdcutAdmin.tsx
+++ b/webapp/src/pages/admin/AddProdcutAdmin.tsx
@@ -1,163 +1,13 @@
-import React, { FC, useEffect, useState } from 'react';
-import Box from '@mui/material/Box';
-import Stack from '@mui/material/Stack';
-import Button from '@mui/material/Button';
-import Card from '@mui/material/Card';
-import { CardHeader, CardMedia, Container } from '@mui/material';
-import TextField from '@mui/material/TextField';
-import Select, { SelectChangeEvent } from '@mui/material/Select';
-import InputLabel from '@mui/material/InputLabel';
-import MenuItem from '@mui/material/MenuItem';
-import FormControl from '@mui/material/FormControl';
-import {v4 as uuidv4} from 'uuid';
-import axios from 'axios';
-import Swal from 'sweetalert2';
-
+import { FC } from 'react';
+import AddProduct from '../../components/admin/AddProduct';
const AddProdutcAdmin: FC = () => {
- function checkCampos(url: string, nombre: string, descipcion: string, precio: string, stock: string){
- if(url === '' || url === null || nombre === '' || nombre === null ||
- descipcion === '' || descipcion === null || Number.parseFloat(precio) < 0 || Number.parseInt(stock) < 0 ){
- Swal.fire({
- title: "ERROR",
- text: "Alguno de los campos introducidos no es correcto",
- icon: "error"
- });
- }
- }
-
- async function addProduct(url: string, nombre: string, descripcion: string, precio: string, categoria: string, stock: string){
- checkCampos(nombre, url, descripcion, precio, stock);
- let codigo = uuidv4();
- axios.post("http://localhost:5000/product/addPost", {"codigo": codigo,
- "nombre": nombre, "categoria": categoria, "stock": Number.parseInt(stock),
- "precio": Number.parseFloat(precio), "url": url, "descripcion": descripcion}).then(
- res => {
- console.log("Llego hasta aqui")
- if(res.status === 201){
- Swal.fire({
- title: "UProducto añadido",
- text: "Se ha añadido el prodcuto sin problemas",
- icon: "success"
- });
- } else {
- Swal.fire({
- title: "ERROR",
- text: "Se ha producido un error con los productos",
- icon: "error"
- });
- }
- }
- )
- }
-
- const [urlBase, setUrl] = useState('https://i.postimg.cc/25fVD0hz/TE01.jpg')
- const [nombreP , setNombre] = useState('')
- const [descrip, setDescripcion] = useState('')
- const [stock, setStock] = useState('')
- const [precio, setPrecio] = useState('')
- const [categoria, setCategoria] = useState('')
-
- const handleChange = (event: SelectChangeEvent) => {
- setCategoria(event.target.value as string)
- }
-
+
return (
-
-
-
-
-
-
-
-
-
-
-
- setUrl(e.target.value)}
- />
-
- setNombre(e.target.value)}
- />
-
- setStock(e.target.value)}
- />
-
- setPrecio(e.target.value)}
- />
-
- setDescripcion(e.target.value)}
- />
-
-
- Categoría
-
- teclado
- monitor
- raton
- almacenamiento
- sonido
-
-
-
- addProduct(urlBase, nombreP, descrip, precio, categoria, stock)}>Añadir Producto Nuevo
-
-
-
-
-
-
-
-
+
);
-}
+}
export default AddProdutcAdmin;
\ No newline at end of file
diff --git a/webapp/src/pages/admin/IUserAdmin.tsx b/webapp/src/pages/admin/IUserAdmin.tsx
deleted file mode 100644
index d3386dd..0000000
--- a/webapp/src/pages/admin/IUserAdmin.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { User } from '../../shared/shareddtypes';
-import TableCell from '@mui/material/TableCell';
-import TableRow from '@mui/material/TableRow';
-import Button from '@mui/material/Button';
-
-
-type UserProps = {
- user: User[]
-}
-
-const IUserAdmin = (user: UserProps): JSX.Element => {
-
- function tipoUsuario(nombre: string) {
- if(nombre === "admin@uniovi.es"){
-
- return Quitar admin
-
- }else {
- return Hacer admin
- }
- }
-
- return (
- <>
- {user.user.map((u) => {
- return(
-
- {u.email}
-
- Ver pedidos
-
-
- {tipoUsuario(u.email)}
-
-
- );
- })}
- >
- );
-}
-
-
-export default IUserAdmin;
\ No newline at end of file
diff --git a/webapp/src/pages/admin/ManageOrders.tsx b/webapp/src/pages/admin/ManageOrders.tsx
index e4a1797..402cde6 100644
--- a/webapp/src/pages/admin/ManageOrders.tsx
+++ b/webapp/src/pages/admin/ManageOrders.tsx
@@ -29,8 +29,9 @@ const ManageOrders: FC = () => {
}
useEffect(() => {cargarPedidos();}, []);
-
+ console.log(orders);
return (
+
diff --git a/webapp/src/pages/admin/ManageProducts.tsx b/webapp/src/pages/admin/ManageProducts.tsx
index bff3958..a7fbb0b 100644
--- a/webapp/src/pages/admin/ManageProducts.tsx
+++ b/webapp/src/pages/admin/ManageProducts.tsx
@@ -9,7 +9,6 @@ import { getProducts } from '../../api/api';
import { Product } from '../../shared/shareddtypes';
import ProdAdmin from '../admin/ProdAdmin';
import { styled } from '@mui/material/styles';
-import StackAdmin from '../../components/admin/StackAdmin';
const StyledTableCell = styled(TableCell)(({ theme }) => ({
@@ -20,9 +19,7 @@ const StyledTableCell = styled(TableCell)(({ theme }) => ({
[`&.${tableCellClasses.body}`]: {
fontSize: 14,
},
- }));
-
-
+}));
const ManageProducts: FC = () => {
const [prod, setProd] = React.useState([]);
diff --git a/webapp/src/pages/admin/OrderAdmin.tsx b/webapp/src/pages/admin/OrderAdmin.tsx
index 8ad1156..c667428 100644
--- a/webapp/src/pages/admin/OrderAdmin.tsx
+++ b/webapp/src/pages/admin/OrderAdmin.tsx
@@ -16,9 +16,9 @@ const OrderAdmin = (order: OrderProps) => {
{o.codigo}
{o.fecha.toLocaleString().substring(0, 10)}
{o.correo}
- {o.precioTotal}
+ {o.precioTotal.toFixed(2)}
- {o.products.map((p) => {return p.nombre + " (" + 0 + " uds) "})}
+ {o.products.map((p) => {return p.nombre + " (" + p.stock + " uds) "})}
);
diff --git a/webapp/src/pages/admin/ProdAdmin.tsx b/webapp/src/pages/admin/ProdAdmin.tsx
index 20951d9..1eafcc6 100644
--- a/webapp/src/pages/admin/ProdAdmin.tsx
+++ b/webapp/src/pages/admin/ProdAdmin.tsx
@@ -82,7 +82,8 @@ const ProdAdmin = (produc: ProductsProps): JSX.Element => {
async function allFunc(codigo: string, nombre: string, descrip: string, stock: number, precio: number, url: string) {
// http://localhost:5000/product/update/codeExample/?nombre=namePrueba&descripcion=descripcionPrueba
- axios.get("http://localhost:5000/product/update/" +
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.get(apiEndPoint + "/product/update/" +
codigo + "/?nombre=" + nombre + "&descripcion" + descrip +
"&precio=" + precio + "&url=" + url + '&stock=' + stock).then(
res => {
@@ -117,7 +118,8 @@ const ProdAdmin = (produc: ProductsProps): JSX.Element => {
confirmButtonText: 'Sí'
}).then((result) => {
if (result.isConfirmed) {
- axios.get("http://localhost:5000/product/delete/" + pro.codigo).then(res => {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.get(apiEndPoint + "/product/delete/" + pro.codigo).then(res => {
if(res.status !== 404){
Swal.fire(
'Eliminado!',
diff --git a/webapp/src/pages/admin/UsersAdmin.tsx b/webapp/src/pages/admin/UsersAdmin.tsx
deleted file mode 100644
index 62dfb9d..0000000
--- a/webapp/src/pages/admin/UsersAdmin.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import React, { FC, useEffect, useState } from 'react';
-import Table from '@mui/material/Table';
-import { TableContainer, TableHead} from '@mui/material';
-import Paper from '@mui/material/Paper';
-import TableBody from '@mui/material/TableBody';
-import TableCell, { tableCellClasses } from '@mui/material/TableCell';
-import TableRow from '@mui/material/TableRow';
-import { styled } from '@mui/material/styles';
-import { User } from '../../shared/shareddtypes';
-import axios from 'axios';
-import IUserAdmin from '../admin/IUserAdmin';
-
-const StyledTableCell = styled(TableCell)(({ theme }) => ({
- [`&.${tableCellClasses.head}`]: {
- backgroundColor: "#1976d2",
- color: theme.palette.common.white,
- },
- [`&.${tableCellClasses.body}`]: {
- fontSize: 14,
- },
-}));
-
-const UserAdmin: FC = () => {
-
- const [users, setUsers] = React.useState([]);
-
- const getUsers = async () => {
- const data = axios.get("http://localhost:5000/user/list").then (
- res => {
- setUsers(res.data)
- return res.data
- }
- )
-
- return data != null;
- }
-
- useEffect (() => {getUsers();}, [])
-
- return(
-
-
-
-
-
- Correo Usuario
- Ver pedidos de usuarios
- Administrar Usuarios
-
-
-
- {/* Cuerpo de la tabla */}
-
-
-
-
-
-
-
-
- );
-}
-
-export default UserAdmin;
\ No newline at end of file
diff --git a/webapp/src/pages/user/OrderHistory.tsx b/webapp/src/pages/user/OrderHistory.tsx
index c7bd355..abd5e09 100644
--- a/webapp/src/pages/user/OrderHistory.tsx
+++ b/webapp/src/pages/user/OrderHistory.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from 'react';
+import React, { useEffect } from 'react';
import Table from '@mui/material/Table';
import { TableContainer, TableHead} from '@mui/material';
import TableBody from '@mui/material/TableBody';
@@ -25,12 +25,12 @@ const StyledTableCell = styled(TableCell)(({ theme }) => ({
}));
async function ordersByEmail(order:Order[], orderEmail:Order[], email:String){
- order.forEach(e => {if(e.correo == email){ orderEmail.push(e) }});
+ order.forEach(e => {if(e.correo === email){ orderEmail.push(e) }});
}
const OrderHistory = (id: Id) => {
const [orders, setOrders] = React.useState([]);
- const[ordersEmail, setOrdersEmail] = React.useState([]);
+ const[ordersEmail] = React.useState([]);
async function cargarPedidos() {
setOrders(await getOrders());
diff --git a/webapp/src/pages/user/Profile.tsx b/webapp/src/pages/user/Profile.tsx
index 9dc8a36..e757bc1 100644
--- a/webapp/src/pages/user/Profile.tsx
+++ b/webapp/src/pages/user/Profile.tsx
@@ -1,28 +1,33 @@
-import React, { useState, FC } from 'react';
+/* import React, { useState} from 'react'; */
import Container from '@mui/material/Container';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import Stack from '@mui/material/Stack';
-import { Typography } from '@mui/material';
import { Card, CardContent } from '@mui/material';
-import axios from 'axios';
-import {User} from '../../shared/shareddtypes';
-import Link from '@mui/material/Link';
-import Swal from 'sweetalert2';
+/* import axios from 'axios'; */
+/* import {User} from '../../shared/shareddtypes';
+import Swal from 'sweetalert2'; */
+import jwt_decode from "jwt-decode";
+import AccountCircleIcon from '@mui/icons-material/AccountCircle';
+import WarningAmberIcon from '@mui/icons-material/WarningAmber';
type Email = {
email:String
}
const Profile = (correo:Email) => {
- let [user, setUser] = React.useState({_id: "", name: "",email: "",surname: "", password: ""});
- const [name, setName] = useState('')
- const [surname, setSurname] = useState('')
- const [email, setEmail] = useState('')
- const [pulse, setPulse] = useState(false)
- const getUserByEmail = async (email:String) => {
- const data = await axios.get("http://localhost:5000/user/list/" + email).
+ function metodo() {
+ localStorage.clear();
+ window.location.assign("/login");
+ }
+
+ /* let [user, setUser] = React.useState({_id: "", name: "",email: "",surname: "", password: ""});
+ const [pulse, setPulse] = useState(false) */
+
+ /* const getUserByEmail = async (email:String) => {
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ const data = await axios.get(apiEndPoint + "/user/list/" + email).
then(res => {
setUser(res.data);
return res.data;
@@ -30,22 +35,23 @@ const Profile = (correo:Email) => {
return data != null;
}
- getUserByEmail(correo.email);
- const updateUser = (id:String,name?:String,surname?:String,email?:String) => {
- if(name == ''){
+ getUserByEmail(correo.email); */
+ /* const updateUser = (id:String,name?:String,surname?:String,email?:String) => {
+ if(name === ''){
name = user.name
}
- if(surname == ''){
+ if(surname === ''){
surname = user.surname
}
- if(email == ''){
+ if(email === ''){
email = user.email
}
- axios.put("http://localhost:5000/user/update/" + id,{"name":name,"surname":surname,"email":email})
+ const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000'
+ axios.put(apiEndPoint + "/user/update/" + id,{"name":name,"surname":surname,"email":email})
.then(res => {
console.log(res);
console.log(res.data);
- if(res.status == 404){
+ if(res.status === 404){
Swal.fire({
title: "Perfil modificado",
text: "El perfil ha sido modificado con exito",
@@ -55,84 +61,61 @@ const Profile = (correo:Email) => {
});
}
})
- }
+ } */
- async function allFunc(id:String,name:String,surname:String,email: String){
+ /* async function allFunc(id:String,name:String,surname:String,email: String){
setPulse(true);
updateUser(id, name, surname, email);
- }
-
- return (
-
-
-
-
- Mi Perfil
-
-
-
-
- Correo electrónico:
+ } */
- setEmail(e.target.value)}
- style={{position:'relative', top:-20}}
- />
-
- Nombre:
-
- setName(e.target.value)}
- style={{position:'relative', top:-20}}
- />
-
- Apellidos:
-
- setSurname(e.target.value)}
- style={{position:'relative', top:-20}}
- />
-
- Contraseña:
-
-
-
- allFunc(user._id,name,surname,email)} variant="contained" type="submit"> Aplicar cambios
- Quiero cambiar mi contraseña.
-
-
-
-
-
- );
+ if(localStorage.getItem('token') != null){
+ var user2:any = jwt_decode(localStorage.getItem('token') || '{}');
+ console.log(user2.id);
+ return (
+
+
+
+
+
+
+ MI PERFIL
+
+ {user2.correo}
+
+
+
+
+
);
+ } else {
+ return(
+
+
+
+
+
+
+
+
+ Error
+ No hay sesión inciada, por favor inicie sesión
+ metodo()}>Iniciar Sesión
+
+
+
+
+
+ );
+ }
}
export default Profile;
\ No newline at end of file
diff --git a/webapp/src/pages/utils/HelpPage.tsx b/webapp/src/pages/utils/HelpPage.tsx
new file mode 100644
index 0000000..072ef36
--- /dev/null
+++ b/webapp/src/pages/utils/HelpPage.tsx
@@ -0,0 +1,24 @@
+import React from "react";
+import {Stack} from '@mui/material';
+
+const HelpPage = () => {
+ return (
+
+
+ ¿Qué es DeDe?
+ Empresa que vende productos electrónicos, en la que la direccion del cliente no se almacenara, sino que será
+ obtenida mediante su POD.
+
+ Esta página web presneta dos vistas, una para cliente y otra para administrador. A continuación se muestran
+ dos videos de como funciona cada una de ellas
+
+ VIDEO
+
+ El vídeo que se muestra a continuación sería de como funciona la aplicación desde una vista de administrador
+ VIDEO
+
+
+ );
+}
+
+export default HelpPage;
\ No newline at end of file
diff --git a/webapp/src/pages/utils/NoPermissions.tsx b/webapp/src/pages/utils/NoPermissions.tsx
new file mode 100644
index 0000000..6d6b5e6
--- /dev/null
+++ b/webapp/src/pages/utils/NoPermissions.tsx
@@ -0,0 +1,31 @@
+import { Card, CardContent, Container, Stack, Button } from '@mui/material';
+import WarningAmberIcon from '@mui/icons-material/WarningAmber';
+
+const NoPermissions = () => {
+
+ function metodo() {
+ localStorage.clear();
+ window.location.assign("/login");
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ No dispone de los permisos necesarios para acceder a la ruta introducida
+ Por favor cierre sesión e intentelo de nuevo
+ metodo()}>Cerrar Sesión Actual e Iniciar Sesión
+
+
+
+
+
+ );
+}
+
+export default NoPermissions;
\ No newline at end of file
diff --git a/webapp/src/tests/HomeTest.test.tsx b/webapp/src/tests/HomeTest.test.tsx
new file mode 100644
index 0000000..3f92d56
--- /dev/null
+++ b/webapp/src/tests/HomeTest.test.tsx
@@ -0,0 +1,12 @@
+import { render, screen } from '@testing-library/react';
+import Home from '../pages/Home';
+import { Product} from '../shared/shareddtypes';
+
+test('Home Page de la aplicacion', async () => {
+ const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
+ const productOnCart:any = {};
+ render();
+ const linkElement = screen.getByAltText(/Banner/i);
+ expect(linkElement).toBeInTheDocument();
+ expect(screen.getByText(/Últimas unidades/i)).toBeInTheDocument();
+});
\ No newline at end of file
diff --git a/webapp/src/tests/LogIn.test.tsx b/webapp/src/tests/LogIn.test.tsx
new file mode 100644
index 0000000..172b68d
--- /dev/null
+++ b/webapp/src/tests/LogIn.test.tsx
@@ -0,0 +1,12 @@
+/* eslint-disable testing-library/prefer-screen-queries */
+import { render } from '@testing-library/react';
+
+import LogIn from '../pages/LogIn';
+
+test('Carga correcta de la ventana LogIn',async () => {
+ const {getAllByText} = render(
+
+ );
+
+ expect(getAllByText("Introduza su contraseña")[0]).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/Pago.test.tsx b/webapp/src/tests/Pago.test.tsx
new file mode 100644
index 0000000..aab33fc
--- /dev/null
+++ b/webapp/src/tests/Pago.test.tsx
@@ -0,0 +1,9 @@
+import { render, screen } from '@testing-library/react';
+import Pago from '../pages/Pago';
+
+test('Ventana Pago', async () => {
+ render( )
+ expect(screen.getByText(/Comprueba tu direccion/i)).toBeInTheDocument();
+ expect(screen.getByText(/Dirección de envío, por favor ingrese el nombre de su POD/i)).toBeInTheDocument();
+});
+
diff --git a/webapp/src/tests/Products.test.tsx b/webapp/src/tests/Products.test.tsx
new file mode 100644
index 0000000..ad195e0
--- /dev/null
+++ b/webapp/src/tests/Products.test.tsx
@@ -0,0 +1,25 @@
+import { render, screen } from '@testing-library/react';
+import ListProducts from '../pages/ListProducts';
+import {Product} from '../shared/shareddtypes';
+import Productos from '../components/Products';
+
+test('Ventana Productos', async () => {
+ const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
+ const productOnCart:any = {};
+ render();
+ expect(screen.getByText(/Categorías/i)).toBeInTheDocument();
+ expect(screen.getByText(/Menor a mayor/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/Precio/i)).toBeInTheDocument();
+});
+
+test('Ventana Productos stock > 0', async () => {
+ const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
+ const productOnCart:any = {};
+ /* render(
+ <>
+
+ >
+ );
+ expect(screen.getByText(/PruebaTecado/i)).toBeInTheDocument(); */
+});
+
diff --git a/webapp/src/tests/SignUp.test.tsx b/webapp/src/tests/SignUp.test.tsx
new file mode 100644
index 0000000..0deada4
--- /dev/null
+++ b/webapp/src/tests/SignUp.test.tsx
@@ -0,0 +1,12 @@
+/* eslint-disable testing-library/prefer-screen-queries */
+import { render } from '@testing-library/react';
+
+import Signup from '../pages/Signup';
+
+test('Carga correcta de la ventana SingUp',async () => {
+ const {getAllByText} = render(
+
+ );
+
+ expect(getAllByText("Nombre")[0]).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/admin/AddProduct.test.tsx b/webapp/src/tests/admin/AddProduct.test.tsx
new file mode 100644
index 0000000..067125c
--- /dev/null
+++ b/webapp/src/tests/admin/AddProduct.test.tsx
@@ -0,0 +1,24 @@
+/* eslint-disable testing-library/prefer-screen-queries */
+import { render, screen } from '@testing-library/react';
+import AddProdutcAdmin from '../../pages/admin/AddProdcutAdmin';
+import AddProduct from '../../components/admin/AddProduct';
+
+test('Admin -> Añadir Productos sin permisos', async () => {
+ const {getAllByText} = render( )
+
+ expect(getAllByText("Precio Base Producto *")[0]).toBeInTheDocument();
+ expect(getAllByText("Categoría *")[0]).toBeInTheDocument();
+ expect(getAllByText("Nombre Producto *")[0]).toBeInTheDocument();
+});
+
+
+test('Admin -> Añadir Productos con permisos', async () => {
+ render(
+
+ )
+
+ expect(screen.getByText(/Añadir un nuevo producto/i)).toBeInTheDocument();
+ // Price *
+ expect(screen.getByText(/Añadir producto nuevo/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/Precio Base Producto */i)).toBeInTheDocument();
+}) ;
\ No newline at end of file
diff --git a/webapp/src/tests/admin/AdminProducts.test.tsx b/webapp/src/tests/admin/AdminProducts.test.tsx
new file mode 100644
index 0000000..66b2731
--- /dev/null
+++ b/webapp/src/tests/admin/AdminProducts.test.tsx
@@ -0,0 +1,22 @@
+import { render, screen } from '@testing-library/react';
+import {Product} from '../../shared/shareddtypes';
+import { Table, TableBody } from '@mui/material';
+import ProdAdmin from '../../pages/admin/ProdAdmin';
+import ManageProducts from '../../pages/admin/ManageProducts';
+
+test('Admin -> Administrar Productos Base Datos', async () => {
+ const productList:Product[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
+ render(
+ );
+ expect(screen.getByText(/PruebaTecado/i)).toBeInTheDocument();
+ expect(screen.getByText(/Administrar/i)).toBeInTheDocument();
+});
+
+test('Admin -> Administrar Productos Base', async () => {
+ render( );
+ expect(screen.getByText(/Código/i)).toBeInTheDocument();
+});
\ No newline at end of file
diff --git a/webapp/src/tests/admin/Orders.test.tsx b/webapp/src/tests/admin/Orders.test.tsx
new file mode 100644
index 0000000..73b48ca
--- /dev/null
+++ b/webapp/src/tests/admin/Orders.test.tsx
@@ -0,0 +1,26 @@
+import { render, screen } from '@testing-library/react';
+import {Order, Object} from '../../shared/shareddtypes';
+import { Table, TableBody } from '@mui/material';
+import OrderAdmin from '../../pages/admin/OrderAdmin';
+import ManageOrders from '../../pages/admin/ManageOrders';
+
+test('Admin -> Administrar Pedidos Inside', async () => {
+ const productList:Object[] = [{codigo: "TE01", categoria: "teclado", nombre: "PruebaTecado", precio: 20, stock: '4', url: "aa", descripcion: "", cantidad: 0}];
+ const pedido: Order[] = [{codigo: "A", correo: "a@uniovi", fecha: new Date(), precioTotal: 140.23, products: productList},
+ {codigo: "B", correo: "b@uniovi", fecha: new Date(), precioTotal: 140.23, products: productList}]
+
+
+ render(
+ )
+ expect(screen.getByText(/a@uniovi/i)).toBeInTheDocument();
+});
+
+test('Admin -> Administrar Pedidos', async () => {
+ render( )
+ expect(screen.getByText(/Correo del comprador/i)).toBeInTheDocument();
+});
+
\ No newline at end of file
diff --git a/webapp/src/tests/components/ProductsSummary.test.tsx b/webapp/src/tests/components/ProductsSummary.test.tsx
new file mode 100644
index 0000000..f4d68a3
--- /dev/null
+++ b/webapp/src/tests/components/ProductsSummary.test.tsx
@@ -0,0 +1,7 @@
+import { render, screen } from '@testing-library/react';
+import ProductSummary from '../../pages/ProductsSummary';
+
+test('Componente Producto Sumario', async () => {
+ render( )
+ expect(screen.getByText(/Completar el pago/i)).toBeInTheDocument();
+});
\ No newline at end of file
diff --git a/webapp/src/tests/user/OrderHistory.test.tsx b/webapp/src/tests/user/OrderHistory.test.tsx
new file mode 100644
index 0000000..81b2e0d
--- /dev/null
+++ b/webapp/src/tests/user/OrderHistory.test.tsx
@@ -0,0 +1,8 @@
+import { render, screen } from "@testing-library/react";
+import OrderHistory from '../../pages/user/OrderHistory';
+
+test('Carga bien historial pedidos', async () => {
+ render();
+
+ expect(screen.getByText(/Fecha de orden/i)).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/user/Profile.test.tsx b/webapp/src/tests/user/Profile.test.tsx
new file mode 100644
index 0000000..2e4275d
--- /dev/null
+++ b/webapp/src/tests/user/Profile.test.tsx
@@ -0,0 +1,12 @@
+
+import { render, screen } from '@testing-library/react';
+
+import Profile from '../../pages/user/Profile';
+
+test('Carga correcta de la ventana SingUp',async () => {
+ render(
+
+ );
+
+ expect(screen.getByText(/No hay sesión inciada, por favor inicie sesión/i)).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/utils/Footer.test.tsx b/webapp/src/tests/utils/Footer.test.tsx
new file mode 100644
index 0000000..e6556d6
--- /dev/null
+++ b/webapp/src/tests/utils/Footer.test.tsx
@@ -0,0 +1,12 @@
+import { render, screen } from '@testing-library/react';
+import Footer from '../../components/Footer/Footer';
+
+test('Footer de la aplicación', async () => {
+ render(
+ <>
+
+ >
+ );
+
+ expect(screen.getByText(/Información adicional/i)).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/utils/HelpPage.test.tsx b/webapp/src/tests/utils/HelpPage.test.tsx
new file mode 100644
index 0000000..e38b403
--- /dev/null
+++ b/webapp/src/tests/utils/HelpPage.test.tsx
@@ -0,0 +1,15 @@
+/* eslint-disable testing-library/prefer-screen-queries */
+import { render, screen } from '@testing-library/react';
+
+import HelpPage from '../../pages/utils/HelpPage';
+
+
+test('Carga correcta de la ventana Help Page',async () => {
+ render(
+
+ );
+
+
+ expect(screen.getByText(/Empresa que vende productos electrónicos, en la que la direccion del cliente no se almacenara, sino que será obtenida mediante su POD./i)).toBeInTheDocument();
+ expect(screen.getByText(/¿Qué es DeDe?/i)).toBeInTheDocument();
+ })
\ No newline at end of file
diff --git a/webapp/src/tests/utils/NavBar.test.tsx b/webapp/src/tests/utils/NavBar.test.tsx
new file mode 100644
index 0000000..e9da01c
--- /dev/null
+++ b/webapp/src/tests/utils/NavBar.test.tsx
@@ -0,0 +1,24 @@
+import { render, screen, fireEvent } from '@testing-library/react';
+import NavBar from '../../components/navbar/NavBar';
+import NavBarAdmin from '../../components/navbar/NavBarAdmin';
+
+test('NavBar de la aplicación', async () => {
+ render(
+ <>
+
+ >
+ );
+
+ expect(screen.getByText(/DeDe/i)).toBeInTheDocument();
+})
+
+test('NavBar de la aplicación en Admin', async () => {
+ render(
+ <>
+
+ >
+ );
+
+ expect(screen.getByText(/Añadir Productos/i)).toBeInTheDocument();
+ expect(screen.getByText(/Cerrar sesión/i)).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/webapp/src/tests/utils/NoPermissions.test.tsx b/webapp/src/tests/utils/NoPermissions.test.tsx
new file mode 100644
index 0000000..4d04549
--- /dev/null
+++ b/webapp/src/tests/utils/NoPermissions.test.tsx
@@ -0,0 +1,9 @@
+import { render, screen} from '@testing-library/react';
+
+import NoPermissions from '../../pages/utils/NoPermissions';
+
+
+test('Carga correcta de la ventana Help Page',async () => {
+ render( );
+ expect(screen.getByText(/No dispone de los permisos necesarios para acceder a la ruta introducida/i)).toBeInTheDocument();
+ })
\ No newline at end of file
diff --git a/webapp/test/Home.test.tsx b/webapp/test/Home.test.tsx
deleted file mode 100644
index a927303..0000000
--- a/webapp/test/Home.test.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import { useState } from 'react';
-import Home from '../src/pages/Home';
-import { Product } from '../src/shared/shareddtypes';
-
-
-
-test('prueba', () => {
- const [cartItems,setCartItems] = useState([]);
- const onAddCart = (prod : Product) => {
- const exist = cartItems.find(x=> x.codigo === prod.codigo);
- if(exist){
- setCartItems(cartItems.map(x=> x.codigo === prod.codigo ? {...exist, cantidad : exist.cantidad +1} : x))
-
- } else {
- setCartItems([...cartItems,{...prod,cantidad:1}])
- }
- }
-
- render()
- const linkElement = screen.getByAltText(/Banner/i);
- expect(linkElement).toBeInTheDocument();
-});